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
#include<stdio.h> #include<algorithm> #define inf 10e8 using std::min; int d[50][15]; int main() { int r,n,a,b,c; scanf("%d",&r); while(r--) { scanf("%d",&n); for(int i=1;i<=n;i++) { int m; scanf("%d",&m); for(int j=1;j<=m;j++) d[i][j]=inf; } d[0][1]=0; d[n+1][1]=inf; for(int i=1;i<=n+1;i++) { while(scanf("%d",&a),a) { scanf("%d%d",&b,&c); d[i][b]=min(d[i-1][a]+c,d[i][b]); } } printf("%d\n",d[n+1][1]); } }
#include<stdio.h> #define N 10000 #define inf 10e8 int count[N],d[N],cost[N][N],n,end; bool visit[N]; void Prepare() { for(int i=0;i<=end;i++) { cost[i][i]=0; visit[i]=true; d[i]=inf; for(int j=i+1;j<=end;j++) cost[i][j]=cost[j][i]=inf; } d[0]=0; } void prim() { while(true) { int x=-1; for(int i=0;i<=end;i++) if(!visit[i]) { if( x==-1 || d[x]>d[i]) x=i; } if(x == -1) break; //printf("%d %d %d\n",x,d[x]); for(int i=0;i<=end;i++) { if(!visit[i] && d[i]>d[x]+cost[x][i]) d[i]=d[x]+cost[x][i]; } visit[x]=true; } printf("%d\n",d[end]); } int main() { int r,m,k,a,b,c; scanf("%d",&r); while(r--) { scanf("%d",&n); end=(n+1)*10; Prepare(); for(int i=1;i<=n;i++) scanf("%d",&count[i]); for(int i=1;i<=n+1;i++) while(scanf("%d",&a),a) { scanf("%d%d",&b,&c); m=a+(i-1)*10-1; k=b+i*10-1; visit[k]=visit[m]=false; if(c<cost[m][k]) cost[m][k]=c; } prim(); } }