去北京看奥运
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1080 Solved: 506
Description
2008年将到,王飞同学化了九牛二虎之力搞到了2张2008年奥运会足球赛决赛的门票。真是开心啊!他爸爸准备开车跟他一起去北京看球赛。不过门票费好贵啊,所以他爸爸说了,这个钱要在下学期的生活费里扣(好抠门),不过如果他能让从杭州去北京的油费最省(油价最近涨的好厉害啊),那么就不扣生活费了。哈哈,这个就难不倒他了。在ACM里可不是白混的。很快他算出了汽车从杭州到北京必须要加几次油,并查出了到北京要经过哪几个城市,每个城市有哪些加油站以及从某城市各加油站到另一城市各加油站的距离和路况算出了各加油站之间的耗油量。下面是不是很easy?
Input
有多个测试案例。第一行先输入测试案例的数目T。对于每个测试案例,第一行输入一个整数n表示将在中途n(0 < n < 40)个城市中加油,后面紧跟着是n个整数代表每个城市有几个加油站(每个城市加油站不超过10个)。以下n+1行,每行由3个Si,Ej,L一组组成的好几对整数,该行以0结束。表示从前一城市Si第i个加油站(杭州的话就是家拉)出发到该城市第j个加油站消耗的油量为L升。
Output
对于每个测试,输出一行,内容为最小总耗油量。
Sample Input
1 2 2 3 1 1 3 1 2 1 0 1 1 2 1 2 7 2 1 8 2 2 9 2 3 4 0 1 1 5 2 1 6 3 1 6 0
Sample Output
10
1 #include<stdio.h> 2 #include<string.h> 3 #define max 9999999 4 5 int map[500][500]; 6 int vis[500],dis[500]; 7 int sum; 8 9 void dijkstra(int cost[][500],int n) 10 { 11 int i,j,k,minc; 12 memset(vis,0,sizeof(vis)); 13 dis[0]=0; 14 vis[0]=1; 15 for(i=1;i<n;i++)dis[i]=cost[0][i]; 16 for(i=1;i<n;i++) 17 { 18 minc=max; 19 for(j=0;j<n;j++) 20 if(!vis[j]&&dis[j]<minc) 21 { 22 minc=dis[j]; 23 k=j; 24 } 25 if(minc==max) 26 break; 27 vis[k]=1; 28 for(j=0;j<n;j++) 29 if(!vis[j]&&dis[j]>dis[k]+cost[k][j]) 30 { 31 dis[j]=dis[k]+cost[k][j]; 32 } 33 } 34 // for(i=0;i<n;i++) 35 // printf("%d ",dis[i]);dis[]保存到每一个点的最短路 36 printf("%d ",dis[n-1]); 37 } 38 int main() 39 { 40 //freopen("a.txt","r",stdin); 41 int t,n,city[50]; 42 int s,e,l,j,i,tot; 43 scanf("%d",&t); 44 while(t--) 45 { 46 scanf("%d",&n); 47 city[0]=0,city[1]=1; 48 sum=0; 49 tot=2; 50 for(i=2;i<=n+1;i++) 51 { 52 scanf("%d",&city[i]); 53 tot+=city[i]; 54 } 55 for(i=0;i<tot;i++) 56 for(j=0;j<tot;j++) 57 { 58 map[i][j]=max; 59 } 60 for(i=2;i<=n+2;i++) 61 { 62 sum+=city[i-2]; 63 while(scanf("%d",&s)==1&&s) 64 { 65 scanf("%d%d",&e,&l); 66 map[sum+s-1][sum+city[i-1]+e-1]=l; 67 } 68 } 69 70 dijkstra(map,tot); 71 } 72 return 0; 73 }
1 #include<stdio.h> 2 #include<string.h> 3 #define max 9999999 4 5 int map[500][500]; 6 int vis[500],dis[500]; 7 8 void dijkstra(int cost[][500],int n) 9 { 10 int i,j,minc,k; 11 memset(vis,0,sizeof(vis)); 12 for(i=0;i<n;i++) 13 { 14 dis[i]=cost[0][i]; 15 } 16 vis[0]=1; 17 dis[0]=0; 18 for(i=1;i<n;i++) 19 { 20 minc=max; 21 for(j=1;j<n;j++) 22 if(!vis[j]&&dis[j]<minc) 23 { 24 minc=dis[j]; 25 k=j; 26 } 27 if(minc==max) 28 break; 29 vis[k]=1; 30 for(j=1;j<n;j++) 31 if(!vis[j]&&dis[j]>dis[k]+cost[k][j]) 32 { 33 dis[j]=dis[k]+cost[k][j]; 34 } 35 } 36 /* for(i=0;i<n;i++) 37 printf("%d ",dis[i]);*/ 38 printf("%d",dis[n-1]); 39 } 40 41 int main() 42 { 43 //freopen("a.txt","r",stdin); 44 int T,n; 45 int city[50]; 46 int s,e,l; 47 int sum,tot; 48 int i,j; 49 scanf("%d",&T); 50 while(T--) 51 { 52 scanf("%d",&n); 53 city[0]=0,city[1]=1; 54 sum=0; 55 tot=2; 56 for(i=2;i<=n+1;i++) 57 { 58 scanf("%d",&city[i]); 59 tot+=city[i]; 60 } 61 for(i=0;i<tot;i++) 62 for(j=0;j<tot;j++) 63 { 64 map[i][j]=max; 65 } 66 for(i=2;i<=n+2;i++) 67 { 68 sum+=city[i-2]; 69 while(scanf("%d",&s)==1,s) 70 { 71 scanf("%d%d",&e,&l); 72 map[sum+s-1][sum+city[i-1]+e-1]=l; 73 } 74 } 75 /* for(i=0;i<tot;i++) 76 { 77 printf(" "); 78 for(j=0;j<tot;j++) 79 printf("%-9d",map[i][j]); 80 } 81 printf(" ");*/ 82 dijkstra(map,tot); 83 } 84 return 0; 85 }
Dijkstra算法:
(按照原题改的,百度源代码写的有些奇怪,我改了改)
测试数据:
7 10
1 2 3
1 3 1
2 4 2
2 5 7
3 4 8
3 5 9
3 6 4
4 7 5
5 7 6
6 7 6
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define max1 99999999 5 int a[1000][1000]; 6 int d[1000];//d表示某特定边距离 7 int p[1000];//p表示永久边距离 8 int m;//m表示边数 9 int n;//n表示点数 10 11 int main() 12 { 13 freopen("a.txt","r",stdin); 14 scanf("%d%d",&n,&m); 15 memset(p,0,sizeof(p)); 16 int min1; 17 int x,y,z; 18 int i,j,k; 19 for(i=0;i<=n;i++) 20 for(j=0;j<=n;j++) 21 { 22 a[i][j]=max1; 23 } 24 for(i=1;i<=m;i++) 25 { 26 scanf("%d%d%d",&x,&y,&z); 27 a[x][y]=z; 28 // a[y][x]=z; 29 } 30 /* for(i=1;i<=n;i++) 31 { 32 printf(" "); 33 for(j=1;j<=n;j++) 34 { 35 printf("%-9d",a[i][j]); 36 } 37 } */ 38 printf(" "); 39 for(i=1;i<=n;i++) 40 d[i]=max1; 41 d[1]=0; 42 for(i=1;i<=n;i++) 43 { 44 min1=max1; 45 for(j=1;j<=n;j++) 46 if(!p[j]&&d[j]<min1) 47 { 48 min1=d[j]; 49 k=j; 50 } 51 p[k]=1; 52 for(j=1;j<=n;j++) 53 if(a[k][j]!=0&&!p[j]&&d[j]>d[k]+a[k][j]) 54 d[j]=d[k]+a[k][j]; 55 } 56 /* for(i=1;i<n;i++) 57 printf("%d->",d[i]);*/ 58 printf("%d ",d[n]); 59 return 0; 60 }