标签:
14号就ccpc全国赛的全国赛了 而且也快东北赛的选拔赛了
现在队伍实力实在不行 参加了也是边缘化的队伍
虽然有新生保护的设置
但实话说 机会还是不大
所以不如趁现在开始好好努力 明年也许还有机会
An Ac a Day ( of course not keep a girl away ^_^ )
题意呢 一个人开火车 一个人开大巴 火车走铁路 大巴走公路
现在有n个城镇 每两个城镇之间都有路
其中m条铁路 其他的都是公路 要求两个人都从1开始走 途中不相遇 问最快要多久
题面比较诡异 两个人 还不允许相遇
不过题中已经说了每两个城镇之间都有路 所以1到n之间一定有一条公路或一条铁路
因此一定至少有一个人在t=1时就到了 这就不用考虑相遇的事了
接下来对另外一个人最短路就好了~
400的数据Floyd暴力都是可以的 不过闲着也是闲的 复习一下Dijkstra
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<set> 9 #include<vector> 10 #include<queue> 11 #define M(a,b) memset(a,b,sizeof(a)) 12 #define ll long long 13 using namespace std; 14 const int inf=0x3f3f3f; 15 bool vis[405]; 16 bool way[405][405]; 17 int lowcost[405]; 18 int n,m; 19 void Dijkstra(){ 20 for(int i=1;i<=n;i++) 21 lowcost[i]=inf; 22 lowcost[1]=0; 23 for(int i=1;i<=n;i++){ 24 int k=-1; 25 int min_=inf; 26 for(int j=1;j<=n;j++){ 27 if(!vis[j]&&lowcost[j]<min_){ 28 min_=lowcost[j]; 29 k=j; 30 } 31 if(k==-1) continue; 32 vis[k]=true; 33 for(int j=1;j<=n;j++){ 34 if(!vis[j]&&lowcost[k]+way[k][j]<lowcost[j]&&way[k][j]) 35 lowcost[j]=lowcost[k]+way[k][j]; 36 } 37 } 38 } 39 } 40 int main(){ 41 scanf("%d%d",&n,&m); 42 int a,b; 43 for(int i=0;i<m;i++){ 44 scanf("%d%d",&a,&b); 45 way[a][b]=way[b][a]=true; 46 } 47 if(way[1][n]) 48 for(int i=1;i<=n;i++) 49 for(int j=1;j<=n;j++) 50 if(i!=j) way[i][j]=!way[i][j]; 51 Dijkstra(); 52 if(lowcost[n]>=inf) printf("-1\n"); 53 else printf("%d\n",lowcost[n]); 54 return 0; 55 }
[ An Ac a Day ^_^ ] CodeForces 601A The Two Routes 最短路
标签:
原文地址:http://www.cnblogs.com/general10/p/5762697.html