首页 > 代码库 > 2016年9月ccf

2016年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 }
View Code

因为没有注释,可能比较难看懂。不懂的地方,也欢迎和我交流。

2016年9月ccf