標籤:
暢通工程續Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 37272 Accepted Submission(s): 13759
Problem Description某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。
現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。
Input本題目包含多組資料,請處理到檔案結束。
每組資料第一行包含兩個正整數N和M(0<N<200,0<M<1000),分別代表現有城鎮的數目和已修建的道路的數目。城鎮分別以0~N-1編號。
接下來是M行道路資訊。每一行有三個整數A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城鎮A和城鎮B之間有一條長度為X的雙向道路。
再接下一行有兩個整數S,T(0<=S,T<N),分別代表起點和終點。
Output對於每組資料,請在一行裡輸出最短需要行走的距離。如果不存在從S到T的路線,就輸出-1.
Sample Input
3 30 1 10 2 31 2 10 23 10 1 11 2
Sample Output
2-1
Authorlinle
Source2008浙大研究生複試熱身賽(2)——全真類比
/*dijkstra*/#include<cstdio>#include<algorithm>#define MAX 0x3f3f3fusing namespace std;int dis[211],vis[211];int len[211][211];int n,m,s,t;int min(int x,int y){ if(x >= y) return y; return x; }void dijkstra(){ int i,j,k; for( i = 0; i < n; i++) { dis[i] = MAX; vis[i] = 0; } dis[s] = 0; while(1) { k = -1; for( i = 0; i < n ; i++) if(!vis[i] && (k==-1 ||dis[i] < dis[k])) k = i; if(k == -1) break; vis[k] = 1; for(i = 0; i < n; i++) dis[i] = min( dis[i], dis[k]+len[i][k]); } if(dis[t] == MAX) printf("-1\n"); else printf("%d\n",dis[t]);}int main(){ int i,j,k,a,b,x; while(scanf("%d%d",&n,&m)!=EOF) { for( i = 0; i < n; i++) for( j = 0; j < n; j++) len[i][j] = MAX; while(m--) { scanf("%d%d%d",&a,&b,&x); if(len[a][b] > x) { len[a][b] = x; len[b][a] = x; } } scanf("%d%d",&s, &t); dijkstra(); } return 0;}/*spfa*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#include<vector>#define INF 0x3f3f3f#include<algorithm>using namespace std;int n,m;int head[2100],edgenum,dis[2100];bool vis[2100];struct node{ int start,end,len,next;}p[20010];void add(int u,int v,int w){ node E = {u,v,w,head[u]}; p[edgenum] = E; head[u] = edgenum++;}void spfa(int s,int t){ memset(vis,0,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); queue<int> q; q.push(s); dis[s] = 0; vis[s] = 1; while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int i = head[u]; i!=-1;i=p[i].next) { int v = p[i].end; if(dis[v]>dis[u]+p[i].len) { dis[v]=dis[u]+p[i].len; if(!vis[v]) { vis[v] =1; q.push(v); } } } } if(dis[t]>10000) printf("-1\n"); else printf("%d\n",dis[t]); }int main(){ int i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { memset(head,-1,sizeof(head)); edgenum = 0; int a,b,c; while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } int s1,e1; scanf("%d%d",&s1,&e1); spfa(s1,e1); } return 0;}/*floyd*/#include<stdio.h>#include<string.h>#define min(a,b) a>b?b:a#define INF 0x3f3f3f3fint n,m;int dis[211][211];void floyd(){int i,j,k;for(k = 0; k < n; k++)for(i = 0; i < n; i++)for(j = 0; j < n; j++) dis[i][j] = min( dis[i][j], dis[i][k]+dis[k][j] );}int main(){int i,j,k;while(scanf("%d%d",&n,&m)!=EOF){int a,b,x;for(i = 0;i < n; i++){for(j = 0; j < n; j++)if(i==j)dis[i][j] = 0;elsedis[i][j] = INF;}while(m--){scanf("%d%d%d",&a,&b,&x);if(dis[a][b] > x)dis[a][b] = dis[b][a] =x;}int from,to;scanf("%d%d",&from,&to);floyd();if(dis[from][to]==INF)printf("-1\n");elseprintf("%d\n",dis[from][to]);}return 0; }
著作權聲明:原創文章,若要轉載,請與博主聯絡,謝謝
hdoj 1874 暢通工程續【最短路的3種方法】