最短路
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19671 Accepted Submission(s): 8411
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
Sample Output
3 2
#include <stdio.h>
#include <stdlib.h>#include <malloc.h>
#include <string.h>
#include <time.h>
int graph[110][110][2];
int dist[110];
int s[110];
int node;
int edit;
void solve()
{
for(int i=1;i<=node;i++)//初始化dist,所有的都从2开始计算
{
if(graph[1][i][0]==1)
{
dist[i]=graph[1][i][1];
}
}
for(int j=2;j<=node;j++)
{
//printf("entering for loop\n");
int min=2000;
int minnum;
int i;
for(i=2;i<=node;i++)
{
if(s[i]==0&&dist[i]<min&&dist[i]!=-1)
{
min=dist[i];
minnum=i;
}
}
//printf("i=%d,min=%d\n",minnum,min);
//找出最小的
s[minnum]=1;//已经存入s集合中
i=minnum;
//更新dist
int newdist;
for(int k=2;k<=node;k++)
{
if(graph[i][k][0]==1)
{
newdist=dist[i]+graph[i][k][1];
if(newdist<dist[k]||dist[k]==-1)
dist[k]=newdist;
}
}
//for(int ii=1;ii<=node;ii++)
//printf("%d\t",dist[ii]);
//printf("\n");
}
}
int main(int argc, char *argv[])
{
freopen("data.in","r",stdin);
while(1)
{
scanf("%d%d",&node,&edit);
//printf("node=%d,edit=%d\n",node,edit);
if(node==0&&edit==0) break;
memset(graph,0,sizeof(graph));
memset(dist,-1,sizeof(dist));
memset(s,0,sizeof(s));
int x,y,z;
for(int i=0;i<edit;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(graph[x][y][0]==1)
{
if(z<graph[x][y][1])
{
graph[x][y][1]=z;
graph[y][x][1]=z;
}
}
else{
graph[x][y][0]=1;
graph[x][y][1]=z;
graph[y][x][0]=1;
graph[y][x][1]=z;}
}//建图完成
solve();
if(dist[node]==-1)
printf("0\n");
else
printf("%d\n",dist[node]);
//for(int i=1;i<=node;i++)
//printf("%d\t",dist[i]);
//printf("\n");
}
return 0;
}
- Test Data:
- 2 1
- 1 2 3
- 3 3
- 1 2 5
- 2 3 5
- 3 1 2
- 0 0
- 5 9
- 1 2 5
- 1 2 2
- 1 3 2
- 1 3 3
- 1 4 3
- 2 3 5
- 2 5 6
- 3 5 4
- 4 5 9
- // 6
- // 1->3->2 的情况 , 很多人的代码都过不了这题
- 5 9
- 1 2 5
- 1 2 7
- 1 3 2
- 1 3 3
- 1 4 3
- 2 3 1
- 2 5 1
- 3 5 4
- 4 5 9
- // 4
- // 1->3->4->2->5 的情况
- 5 5
- 1 2 10
- 1 3 4
- 2 4 2
- 3 4 3
- 2 5 5
- // 14
- // 1->3->4->2->5 的情况
- 5 6
- 1 2 10
- 1 3 4
- 2 4 2
- 3 4 3
- 2 5 5
- 4 5 100
- // 14
- // 非法数据,终极数据
- 2 4
- 1 2 10
- 1 3 4
- 2 4 2
- 3 4 3
- // 9