poj3268 silver cow partys
阿新 • • 發佈:2021-07-08
題目:
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); }