码迷,mamicode.com
首页 > 其他好文 > 详细

2016年9月ccf

时间:2016-09-14 23:07:17      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

去长沙理工考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

标签:

原文地址:http://www.cnblogs.com/zhenzhenhuang/p/5873609.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!