1. 程式人生 > >poj 3268(dijkstra變形---有向圖來回最短路)

poj 3268(dijkstra變形---有向圖來回最短路)

點選開啟連結
//dijkstra 矩陣轉置 鄰接矩陣
#include <iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
typedef pair<int,int>PII;
const int maxn=1000+5;
const int INF=1e7;
int G[maxn][maxn];
bool done[maxn];
int d[maxn];
int v,e,farm;
void
dijkstra()
{ memset(done,false,sizeof(done)); for(int i=1;i<=v;i++) d[i]=(i==farm?0:INF); priority_queue<PII,vector<PII>,greater<PII> >pq; pq.push(PII(d[farm],farm)); while(!pq.empty()) { PII k=pq.top(); pq.pop(); int t=k.second; if
(done[t]) continue; done[t]=true; for(int i=1;i<=v;i++) { if(d[i]>d[t]+G[t][i]) { d[i]=d[t]+G[t][i]; pq.push(PII(d[i],i)); } } } } int main() { scanf("%d%d%d",&v,&e,&farm); for(int i=1
;i<=v;i++) for(int j=1;j<=v;j++) if(i==j) G[i][j]=0; else G[i][j]=INF; while(e--) { int v1,v2,time; scanf("%d%d%d",&v1,&v2,&time); G[v1][v2]=min(G[v1][v2],time); } dijkstra(); int d2[maxn]; for(int i=1;i<=v;i++) d2[i]=d[i]; //轉置 for(int i=1;i<=v;i++) for(int j=i;j<=v;j++) swap(G[i][j],G[j][i]); dijkstra(); int m=0; for(int i=1;i<=v;i++) m=max(m,d2[i]+d[i]); printf("%d\n",m); return 0; }