题意:
在一个有向图中求n头牛从自己的起点走到x再从x走回来的最远距离
思路一开始是暴力跑dij……
讲道理不太可能……
然后就百度了一下 才知道把矩阵转置的话就只需要求两次x的单源最短路……
1 /* *********************************************** 2 Author :Sun Yuefeng 3 Created Time :2016/10/22 20:09:36 4 File Name :A.cpp 5 ************************************************ */ 6 7 #include<cstdio> 8 #include<iostream> 9 #include<algorithm> 10 #include<cmath> 11 #include<cstring> 12 #include<string> 13 #include<bitset> 14 #include<map> 15 #include<set> 16 #include<stack> 17 #include<vector> 18 #include<queue> 19 #include<list> 20 #define M(a,b) memset(a,b,sizeof(a)) 21 using namespace std; 22 typedef long long ll; 23 const int inf=0x3f3f3f3f; 24 const int maxn=1e3+10; 25 const int mod=1e7+7; 26 int dx[8]= {0,0,1,-1,1,-1,1,-1}; 27 int dy[8]= {1,-1,0,0,-1,1,1,-1}; 28 29 int n,m,x,most; 30 int waycome[maxn][maxn]; 31 int wayback[maxn][maxn]; 32 int dist[maxn]; 33 bool vis[maxn]; 34 35 void dijkstra(int x,int way[][maxn]){ 36 int dis[maxn]; 37 for(int i=1;i<=n;i++){ 38 dis[i]=inf; 39 vis[i]=false; 40 } 41 dis[x]=0; 42 for(int i=1;i<=n;i++){ 43 int k=-1; 44 int min=inf; 45 for(int j=1;j<=n;j++){ 46 if(!vis[j]&&dis[j]<min){ 47 min=dis[j]; 48 k=j; 49 } 50 } 51 vis[k]=true; 52 for(int j=1;j<=n;j++){ 53 if(dis[j]>dis[k]+way[k][j]&&!vis[j]) 54 dis[j]=dis[k]+way[k][j]; 55 } 56 } 57 for(int i=1;i<=n;i++){ 58 dist[i]+=dis[i]; 59 if(dist[i]>most) most=dist[i]; 60 } 61 } 62 63 int main() 64 { 65 //freopen("in.txt","r",stdin); 66 //freopen("out.txt","w",stdout); 67 while(scanf("%d%d%d",&n,&m,&x)!=EOF){ 68 M(waycome,inf); 69 M(wayback,inf); 70 M(dist,0); 71 int u,v,w; 72 most=-1; 73 for(int i=0;i<m;i++){ 74 scanf("%d%d%d",&u,&v,&w); 75 waycome[u][v]=w; 76 wayback[v][u]=w; 77 } 78 dijkstra(x,waycome); 79 dijkstra(x,wayback); 80 printf("%d ",most); 81 } 82 return 0; 83 }