COJ1024(Mining)

题目链接

题目大意:给定一个无向图,指定2个起点s1和s2和一个终点t,2个人分别从s1和s2出发,目的地是t,求两人的最短路径的最大公共长度(在保证两人均走最短路的前提下使两人一起走的路径最长)。

分析:只要两人会合后,就一定会一起走完剩下的全程。所以大体思路是枚举可能的会合点,在判断某个点是否是可能的会合点时,判断这个点是否都是两个人的最短路径上的点即可。求最短路时用到dijkstra。

View Code
 1 #include <stdio.h>
 2 #include <memory.h>
 3 #define N 1000
 4 #define INF 0x7fffff
 5 #define MIN(a,b)  ((a)<(b)?(a):(b))
 6 int g[N][N],dist1[N],dist2[N],dist3[N],n,m;
 7 char vis[N];
 8 void dijkstra(int u,int dist[])
 9 {
10   int v,i,k,min;
11   memset(vis,0,sizeof(vis));
12   for(i=0;i<n;i++)  dist[i]=(i==u?0:INF);
13   for(i=0;i<n;i++)
14   {
15     min=INF;
16     for(v=0;v<n;v++)  if(!vis[v]&&dist[v]<=min) min=dist[k=v];
17     vis[k]=1;
18     for(v=0;v<n;v++)  dist[v]=MIN(dist[v],dist[k]+g[k][v]);
19   }
20 }
21 int main()
22 {
23   int i,j,t,u1,u2,u3,u,v,d,ans;
24   scanf("%d",&t);
25   while(t--)
26   {
27     scanf("%d%d%d%d%d",&n,&u1,&u2,&u3,&m);
28     u1--,u2--,u3--;
29     for(i=0;i<n;i++)
30     {
31       for(j=i+1;j<n;j++)  g[i][j]=g[j][i]=INF;
32     }
33     for(i=0;i<m;i++)
34     {
35       scanf("%d%d%d",&u,&v,&d),u--,v--;
36       g[u][v]=g[v][u]=d;
37     }
38     dijkstra(u1,dist1);
39     dijkstra(u2,dist2);
40     dijkstra(u3,dist3);
41     ans=0;
42     j=u1;
43     for(i=0;i<n;i++)
44     {
45       if(dist1[i]>=ans&&dist1[u2]==dist1[i]+dist2[i]&&dist1[u3]==dist1[i]+dist3[i]) ans=dist1[j=i];
46     }
47     printf("%d %d %d\n",ans,dist2[j],dist3[j]);
48   }
49   return 0;
50 }
原文地址:https://www.cnblogs.com/algorithms/p/2478190.html