最短路 Edit

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input

输入包括多组数据。

每组数据第一行是两个整数NN ,MM (N100N≤100 ,M10000M≤10000 ),NN 表示成都的大街上有几个路口,标号为11 的路口是商店所在地,标号为NN 的路口是赛场所在地,MM 则表示在成都有几条路。N=M=0N=M=0 表示输入结束。

接下来MM 行,每行包括33 个整数AA ,BB ,CC (1A1≤A ,BNB≤N ,1C10001≤C≤1000 ),表示在路口AA 与路口BB 之间有一条路,我们的工作人员需要CC 分钟的时间走过这条路。

输入保证至少存在11 条商店到赛场的路线。

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。

Sample input and output

Sample InputSample Output
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
3
2

Hint

Source

电子科技大学第六届ACM程序设计大赛 初赛
 
题意: 中文题意
 
题解:再来一遍SPFA  当队头节点now出队时 需要 used[now]=0;
 1 #include<bits/stdc++.h>
 2 #define ll __int64
 3 #define mod 1e9+7
 4 #define PI acos(-1.0)
 5 #define bug(x) printf("%%%%%%%%%%%%%",x);
 6 #define inf 1e8
 7 using namespace std;
 8 int  pre[105];
 9 int dis[105];
10 int n,m;
11 int s,t,d;
12 int used[105];
13 int now,zha;
14 int nedge=0;
15 struct node
16 {
17     int pre;
18     int to;
19     int w;
20 }N[20005];
21 void add(int aa,int bb,int cc)
22 {
23     nedge++;
24     N[nedge].to=bb;
25     N[nedge].w=cc;
26     N[nedge].pre=pre[aa];
27     pre[aa]=nedge;
28 }
29 queue<int>q;
30 void spfa()
31 {
32     for(int i=1;i<=n;i++)
33         {
34             dis[i]=inf;
35             used[i]=0;
36         }
37     dis[1]=0;
38     q.push(1);
39     used[1]=1;
40     while(!q.empty())
41     {
42         now=q.front();
43         q.pop();
44         used[now]=0;
45       for(int i=pre[now];i;i=N[i].pre)
46       {
47           if(dis[now]+N[i].w<dis[N[i].to])
48          {
49            dis[N[i].to]=dis[now]+N[i].w;
50            if(!used[N[i].to])
51            {
52               used[N[i].to]=1;
53               q.push(N[i].to);
54            }
55           }
56       }
57     }
58 }
59 int main()
60 {
61     while(scanf("%d %d",&n,&m)&&n&&m)
62  {
63     nedge=0;
64     memset(N,0,sizeof(N));
65     memset(pre,0,sizeof(pre));
66     memset(dis,0,sizeof(dis));
67     for(int i=1;i<=m;i++)
68     {
69         scanf("%d %d %d",&s,&t,&d);
70         add(s,t,d);
71         add(t,s,d);
72     }
73     spfa();
74     printf("%d\n",dis[n]);
75  }
76     return 0;
77 }