1. 程式人生 > 其它 >poj3268 silver cow partys

poj3268 silver cow partys

題目:

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

題意:

找到一個點到x的最短路和x到這個點的最短路的和最大

先dij一次,把資料存下來,再矩陣轉置,再dij一遍,求最大值

dijkstra的變形

程式碼:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm=1e5+3;
const int inf=0x3f3f3f3f;
int mmap[1003][1003],dis[1003],tt[1003],vis[1003];
int n,m; void dij(int s) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) dis[i]=inf; dis[s]=0; for(int i=1;i<n;i++) { int p=0,mmin=inf; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<mmin) { mmin=dis[j]; p
=j; } } vis[p]=1; for(int j=1;j<=n;j++) { if(dis[j]>dis[p]+mmap[p][j]) { dis[j]=dis[p]+mmap[p][j]; } } } } void reve() { for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) swap(mmap[i][j],mmap[j][i]); } }
int main() {int x; scanf("%d %d %d",&n,&m,&x); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) mmap[i][j]=0; else mmap[i][j]=inf; } } int u,v,w; for(int i=1;i<=m;i++) { scanf("%d %d %d",&u,&v,&w); mmap[u][v]=w; } dij(x); for(int i=1;i<=n;i++) tt[i]=dis[i]; reve(); dij(x); int ans=0; for(int i=1;i<=n;i++) { ans=max(ans,tt[i]+dis[i]); } printf("%d\n",ans); }