• 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 }
  • 相关阅读:
    课堂例子验证
    大道至简第三章读后感
    动手动脑例子验证
    各数相加的思路、流程图、源代码及实现截图
    大道至简第二章读后感
    《大道至简》第一章读后感
    个人冲刺08
    个人冲刺07
    构建之法读后感04
    个人冲刺06
  • 原文地址:https://www.cnblogs.com/algorithms/p/2478190.html
Copyright © 2020-2023  润新知