1. 程式人生 > >POJ3268(Dijkstra_鄰接矩陣)

POJ3268(Dijkstra_鄰接矩陣)

algo mem 最短路 print tps lan 選擇 pan 沒有

https://vjudge.net/problem/POJ-3268

題目大意:

n個農場的n頭奶牛將前往x農場,要選擇一條來回時間最短的路徑。

(一頭牛的返回路線可能不同於她最初去派對的路線,因為道路是單向的。)

思路:

//有向圖的迪傑斯特拉

如果以每頭牛為起點遍歷其到x的最短路,耗時太大。

有沒有簡便的方法呢?

如果,以x為起點,找到其余點的最短路,這求出的便是牛返回各自農場的最短路,

由於還要求牛前往x農場的最短路,

我們可以想到一個巧妙的方法:將所有的方向反向,再求一遍以x為起點,找到其余點的最短路

所以就是在最短路的代碼上加一個反向最短路。

 1 #include<iostream>
 2
#include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 #define maxn 1005 6 #define inf 0x3f3f3f3f 7 using namespace std; 8 int cost[maxn][maxn],n,m,x; 9 int disback[maxn],discome[maxn]; 10 bool vis[maxn]; 11 int dij(int x) 12 { 13 int u,minn; 14 for(int
i=1;i<=n;i++) 15 { 16 disback[i]=cost[x][i]; 17 discome[i]=cost[i][x];//將各邊反轉 18 } 19 for(int i=1;i<n;i++) 20 { 21 u=-1,minn=inf; 22 for(int j=1;j<=n;j++) 23 { 24 if(!vis[j]&&disback[j]<minn) 25 {
26 u=j; 27 minn=disback[j]; 28 } 29 } 30 //if(u=-1)return 31 vis[u]=1; 32 for(int v=1;v<=n;v++) 33 { 34 if(!vis[v]&&cost[u][v]!=inf) 35 { 36 if(disback[u]+cost[u][v]<disback[v]) 37 disback[v]=disback[u]+cost[u][v]; 38 } 39 } 40 } 41 memset(vis,0,sizeof vis); 42 for(int i=1;i<n;i++) 43 { 44 minn=inf,u=-1; 45 for(int j=1;j<=n;j++) 46 { 47 if(!vis[j]&&discome[j]<minn) 48 { 49 u=j; 50 minn=discome[j]; 51 } 52 } 53 vis[u]=1; 54 for(int j=1;j<=n;j++) 55 { 56 if(!vis[j]&&cost[j][u]+discome[u]<discome[j]) 57 discome[j]=cost[j][u]+discome[u]; 58 } 59 } 60 minn=-1; 61 for(int i=1;i<=n;i++) 62 minn=max(minn,discome[i]+disback[i]); 63 return minn; 64 } 65 int main() 66 { 67 int i,a,b,c,j; 68 while(~scanf("%d%d%d",&n,&m,&x)) 69 { 70 for(i=1;i<=n;i++) 71 for(j=1;j<=n;j++) 72 { 73 if(i!=j) 74 cost[i][j]=inf; 75 else 76 cost[i][j]=0; 77 } 78 for(i=0;i<m;i++) 79 { 80 scanf("%d%d%d",&a,&b,&c); 81 cost[a][b]=c; 82 } 83 printf("%d\n",dij(x)); 84 } 85 return 0; 86 }

POJ3268(Dijkstra_鄰接矩陣)