UESTC30-最短路-Floyd最短路、spfa+鏈式前向星建圖
阿新 • • 發佈:2017-07-12
ring 輸入 sam -m 努力 成都 edge 輸出 工作
題意好理解,就是最短路。
最短路。。。傳送門http://developer.51cto.com/art/201403/433874.htm
打訓練賽的時候這個題wa了7次,最後也沒寫對,也是沒誰了(;′д`)ゞ
代碼:
最短路
Time Limit: 3000/1000MS (Java/Others)
Memory Limit: 65535/65535KB (Java/Others)
在每年的校賽裏,所有進入決賽的同學都會獲得一件很漂亮的T-shirt
。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?
Input
輸入包括多組數據。
每組數據第一行是兩個整數NN ,MM (N≤100N≤100 ,M≤10000M≤10000 ),NN 表示成都的大街上有幾個路口,標號為11 的路口是商店所在地,標號為NN 的路口是賽場所在地,MM 則表示在成都有幾條路。 N=M=0N=M=0 表示輸入結束。
接下來MM 行,每行包括33 個整數AA ,BB ,CC (1≤A1≤A ,B≤NB≤N ,1≤C≤10001≤C≤1000 ),表示在路口AA 與路口BB 之間有一條路,我們的工作人員需要CC 分鐘的時間走過這條路。
輸入保證至少存在11 條商店到賽場的路線。
Output
對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間。
Sample input and output
Sample Input | Sample Output |
---|---|
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0 |
3 2 |
#include<bits/stdc++.h> usingnamespace std; const int N=100+10; const int INF=0x3f3f3f3f; typedef long long ll; int hh[N][N]; int n,m; int gg(){ //關鍵 for(int h=1;h<=n;h++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) //這裏當時寫錯了,j<=n寫成j<=m了。。。hh[i][j]=min(hh[i][j],hh[i][h]+hh[h][j]); } int main(){ int h,k,l; while(~scanf("%d%d",&n,&m)&&(n||m)){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) hh[i][j]=INF; for(int i=0;i<m;i++){ scanf("%d%d%d",&h,&k,&l); if(l<hh[h][k]) hh[h][k]=hh[k][h]=l; } gg(); printf("%d\n",hh[1][n]); } return 0; }
啊啊啊啊啊啊啊,還有一個思路可以寫,spfa算法+鏈式前向星建圖
然而,前向星有的看懂了,有的還很(O_O)?傳送門http://www.cnblogs.com/Tovi/p/6194786.html
人家的代碼,傳送門http://blog.csdn.net/lvshubao1314/article/details/23034601
代碼:
#include<string.h> #include<stdio.h> #include<iostream> #include<queue> using namespace std; const int maxn=1e5+1; const int INF=1e9; struct node{ int b,w,next; }; node edge[maxn]; int s,n,ip; int head[maxn],que[maxn],visit[maxn],dis[maxn]; void add(int u,int v,int c){ edge[ip].b=v;edge[ip].w=c;edge[ip].next=head[u];head[u]=ip++; } void spfa(int start,int numpoint){ memset(visit,0,sizeof(visit)); for(int i=0;i<=numpoint;i++) dis[i]=INF; int front=-1,tail=-1; dis[start]=0;visit[start]=1;que[++tail]=start; int top,to,temp; while(front!=tail){ if(++front>numpoint)front-=numpoint; top=que[front];visit[top]=0; for(int p=head[top];p!=-1;p=edge[p].next){ to=edge[p].b;temp=dis[top]+edge[p].w; if(dis[to]>temp){ dis[to]=temp; if(!visit[to]){ if(++tail>numpoint)tail-=numpoint; que[tail]=to; visit[to]=1; } } } } } int main(){ int b,w,m,k; while(~scanf("%d%d",&n,&m)){ if(m==0&&n==0)break; int maxx=-100; memset(head,-1,sizeof(head)); ip=0; for(int i=1;i<=m;i++){ cin>>k>>b>>w; if(k>maxx)maxx=k; if(b>maxx)maxx=b; add(k,b,w); add(b,k,w); } spfa(1,maxx); printf("%d\n",dis[n]); } return 0; }
菜的掉渣,繼續努力TAT
UESTC30-最短路-Floyd最短路、spfa+鏈式前向星建圖