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條商店到賽場的路線。
Output對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間
Sample Input
2 11 2 33 31 2 52 3 53 1 20 0
Sample Output
32
數組儲存邊
#include<cstdio>#include<iostream>#include<queue>using namespace std;#define INF 1000005int map[105][105];int n,m;int vis[105];int dis[105];void spfa(){queue<int> q;memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++)dis[i]=INF;dis[1]=0;vis[1]=1;q.push(1);while(!q.empty()){int temp=q.front();q.pop();vis[temp]=0;for(int i=1;i<=n;i++)if(map[temp][i]!=INF&&dis[i]>dis[temp]+map[temp][i]){dis[i]=dis[temp]+map[temp][i];if(!vis[i])q.push(i),vis[i]=1;}}printf("%d\n",dis[n]);}int main(){while(~scanf("%d%d",&n,&m)&&n+m){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=INF;for(int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);map[a][b]=map[b][a]=c;}spfa();}}
鏈表格儲存體
#include<cstdio>#include<iostream>#include<queue>using namespace std;#define INF 1000005int n,m;int next[10005],v[10005],w[10005];int head[105];int vis[105];int dis[105];void spfa(){queue<int> q;memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++)dis[i]=INF;dis[1]=0;vis[1]=1;q.push(1);while(!q.empty()){int temp=q.front();q.pop();vis[temp]=0;for(int i=head[temp];i!=-1;i=next[i])if(!dis[temp]<INF&&dis[v[i]]>dis[temp]+w[i]){dis[v[i]]=dis[temp]+w[i];if(!vis[v[i]]){q.push(v[i]);vis[v[i]]=1;}}}printf("%d\n",dis[n]);}int main(){int eid;while(~scanf("%d%d",&n,&m)&&n+m){eid=1;memset(head,-1,sizeof(head));for(int i=1;i<=m;i++){int from,to,cost;scanf("%d%d%d",&from,&to,&cost);next[eid]=head[from];v[eid]=to;w[eid]=cost;head[from]=eid++;next[eid]=head[to];v[eid]=from;w[eid]=cost;head[to]=eid++;}spfa();}}