poj 3268(dijkstra變形---有向圖來回最短路)
阿新 • • 發佈:2019-02-16
點選開啟連結
//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;
}