hdu2833WuKong 最短路

来源:互联网 发布:centos rar 安装 编辑:程序博客网 时间:2024/06/05 12:42

Wukong tang的最短路径相交的点一定是连续的,

A,B两点是他们相交的点,又A,B都在这两条最短路上,那么从AB的最短路能在这两条最短路上,所以Wukong tang的最短路径相交的点一定是连续的,那么我们只需找最多点的公共子路径就行

代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 310
#define inf 0x3f3f3f3f
int line[maxn][maxn];
int dis[maxn];
int vis[maxn];
int num[maxn][maxn];
int n;int m;
int st,et;
int sw,ew;
int floyd()
{
    int i,j,k;
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
        num[i][j]=(i==j?1:2);
    for(k=1;k<=n;k++)
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
           {
               if(line[i][j]>line[i][k]+line[k][j])
               {
                 line[i][j]=line[i][k]+line[k][j];
                 num[i][j]=num[i][k]+num[k][j]-1;
               }
               else if(line[i][j]==line[i][k]+line[k][j])
               num[i][j]=max(num[i][k]+num[k][j]-1,num[i][j]);
           }
}
int maxpoint()
{
    floyd();
    int ans=0;
    int i,j;
    for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
         if((line[st][i]+line[i][j]+line[j][et]==line[st][et])&&(line[sw][i]+line[i][j]+line[j][ew]==line[sw][ew]))
            ans=max(ans,num[i][j]);
    return ans;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(!n&&!m)
        break;
        int i,j;
        for(i=1;i<=n;i++)
          for(j=1;j<=n;j++)
            {
                line[i][j]=inf;
                line[i][i]=0;
            }
        int a,b,c;
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(line[a][b]>c)
            line[a][b]=line[b][a]=c;
        }
       scanf("%d%d%d%d",&st,&et,&sw,&ew);
       printf("%d\n",maxpoint());
    }
    return 0;
}








0 0