9月ccf
Posted 天气晚来秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9月ccf相关的知识,希望对你有一定的参考价值。
去长沙理工考ccf。恰好又可以见闺蜜。
前2道题很简单,第三题题目太长就跳过了【绕来绕去就像“你儿子是我儿子的爸爸一样头疼”】,就做第四题。但是还有最后一个部分没写写好就到点了。
现在把它补充完整。
我忘记怎么在函数参数中使用二维数组,所以直接把函数写在main里。
分为2个部分,一个是求最短路径,一个是找出要改建的路。
最短路径采用的是dijkstra算法。
寻找要改建的路的部分。我一开始一直想要使用最小支撑树实现【即贪心算法】。但是我后来恍然发现,最后一个状态一定是每个城市都能以最短路径达到首都。那么a城市的最短路径就是与a相邻的某一个城市b的最短路径加上ab城市的距离。
需要说明的是,我没有使用大量数据测试。
仅供参考,如有错误,欢迎指正,共同学习。
1 #include<iostream> 2 #define far 1000 3 using namespace std; 4 int main() 5 { 6 int n,m,i,j,k; 7 int sum=0; 8 int x,y,z; 9 cin>>n>>m; 10 int a[n][n],edge[m]; 11 int visit[n],dis[n]; 12 for(i=0;i<n;i++) 13 { 14 for(j=0;j<n;j++) 15 { 16 a[i][j]=far; 17 } 18 visit[i]=0; 19 dis[i]=far; 20 } 21 for(i=0;i<m;i++) 22 { 23 cin>>x>>y>>z; 24 a[x-1][y-1]=a[y-1][x-1]=z; 25 edge[i]=z; 26 } 27 for(i=0;i<n;i++) 28 { 29 for(j=0;j<n;j++) 30 cout<<a[i][j]<<" "; 31 cout<<endl; 32 } 33 dis[0]=0; 34 int v; 35 for(i=0;i<n;i++) 36 { 37 for(j=0;j<n;j++) 38 { 39 if(visit[j]==0&&dis[j]!=far) 40 v=j; 41 } 42 for(j++;j<n;j++) 43 { 44 if((visit[j]==0)&&(dis[j]<v)) 45 v=j; 46 } 47 visit[v]=1; 48 for(j=0;j<n;j++) 49 { 50 if(dis[j]>dis[v]+a[v][j]) 51 dis[j]=dis[v]+a[v][j]; 52 } 53 54 } 55 for(j=0;j<n;j++) 56 cout<<dis[j]<<" "; 57 cout<<endl; 58 59 60 for(i=0;i<n;i++) 61 visit[i]=0; 62 63 visit[0]=1; 64 for(i=0;i<n;i++) 65 { 66 for(j=0;j<m;j++) 67 { 68 if(edge[j]==dis[i]) 69 { 70 cout<<"改变的边--"<<edge[j]<<endl; 71 sum=sum+edge[j]; 72 edge[j]=0; 73 visit[i]=1; 74 } 75 } 76 } 77 for(i=0;i<n;i++) 78 { 79 if(visit[i]==0) 80 { 81 for(j=0;j<n;j++) 82 { 83 if(dis[j]+a[i][j]==dis[i]) 84 { 85 for(int k=0;k<m;k++) 86 { 87 if(edge[k]==a[i][j]) 88 { 89 cout<<"改变的边--"<<edge[k]<<endl; 90 sum=sum+edge[k]; 91 edge[k]=0; 92 visit[i]=1; 93 break; 94 } 95 } 96 } 97 } 98 } 99 } 100 cout<<endl<<"sum---"<<sum<<endl; 101 cout<<"visit"<<endl; 102 for(i=0;i<n;i++) 103 cout<<visit[i]<<" "; 104 return 0; 105 106 }
因为没有注释,可能比较难看懂。不懂的地方,也欢迎和我交流。
以上是关于9月ccf的主要内容,如果未能解决你的问题,请参考以下文章
;~ 小部分AutoHotkey源代码片段测试模板2019年10月9日.ahk
中国计算机学会2022年度CCF会士名单公布 阿里云李飞飞等9位当选