POJ3268 - Silver Cow Party - Dijkstra跑兩遍最短路
阿新 • • 發佈:2020-07-26
題意
有\(N\)頭牛,序號為1-N(來自不同牛場),他們要去序號為\(X\)的地方參加派對,
問去+返的最少時間。(但是我有疑惑的是:題目的輸出給的是“the maximum of time”???)
每組資料給出N、M、X,接下來M條邊,是有向圖。
思路
先用Dijkstra跑一遍最短路,接著講該鄰接矩陣倒置再跑一遍Dijkstra即可。
關於Dijkstra的優化
https://blog.csdn.net/acm_1361677193/article/details/48211319
AC程式碼
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #include<cmath> #include<list> #include<stdlib.h> #include<map> #include<stack> #include<stdio.h> #include<queue> using namespace std; typedef long long ll; #define sc(T) scanf("%d",&T) #define scc(x,y) scanf("%d %d",&x,&y) #define pr(T) printf("%d\n",T) #define f(a,b,c) for (int a=b;a<=c;a++) #define ff(a,b,c) for (int a=b;a>=c;a--) #define inf 0x3f3f3f3f #define mem(a,b) memset(a,b,sizeof(a)) #define eps 1e-9 #define PI acos(-1) const int N=1010; int n,m,x,e[N][N],dis1[N],dis2[N]; bool book[N]; void dijkstra(int*dis) { f(i,1,n) book[i]=0; book[x]=1; f(i,1,n) dis[i]=e[x][i]; int k; f(i,2,n) { int mi=inf; f(j,1,n) { if(!book[j]&&dis[j]<mi) mi=dis[j],k=j; } book[k]=1; f(j,1,n) dis[j]=min(dis[j],dis[k]+e[k][j]); // max } } int main() { scanf("%d %d %d",&n,&m,&x); f(i,1,n) { f(j,1,n) { if(i==j) e[i][j]=0; else e[i][j]=inf; } } f(i,1,m) { int x,y,z; scanf("%d %d %d",&x,&y,&z); //e[x][y]=max(e[x][y],z); //if(z>e[x][y]) if(z<e[x][y]) e[x][y]=z; } dijkstra(dis1); f(i,1,n) { f(j,i+1,n) swap(e[i][j],e[j][i]); } dijkstra(dis2); int ma=-inf; f(i,1,n) ma=max(ma,dis1[i]+dis2[i]); pr(ma); return 0; }