6 6 1 2 1 2 3 1 3 4 1 4 5 1 1 5 2 4 6 3 1 6 2 4 0 0
3 Hint: One possible arrangement is (1-2-3-4-6) for Wukong and (2-3-4) for Tang Monk. The number of common points are 3.
看了他人的解题报告,下面是来自:http://blog.csdn.net/azheng51714/article/details/8465357
#include<stdio.h>
const int N = 405;
const int inf = 1e9;
int mapt[N][N],dp[N][N],n;
void init()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
mapt[i][j]=inf,dp[i][j]=2;
mapt[i][i]=0; dp[i][i]=1;
}
}
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
if(k!=i)
{
for(int j=1;j<=n;j++)
if(i!=j&&j!=k)
{
if(mapt[i][j]>mapt[i][k]+mapt[k][j])
{
mapt[i][j]=mapt[i][k]+mapt[k][j];
dp[i][j]=dp[i][k]+dp[k][j]-1;
}
else if(mapt[i][j]==mapt[i][k]+mapt[k][j]&&dp[i][j]<dp[i][k]+dp[k][j]-1)
dp[i][j]=dp[i][k]+dp[k][j]-1;
}
}
}
int findAns(int s1,int e1,int s2,int e2)//找一共同的路径,公共点最多
{
int ans=0;
if(mapt[s1][e1]==inf||mapt[s2][e2]==inf)
return ans;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mapt[s1][i]+mapt[i][j]+mapt[j][e1]==mapt[s1][e1])
if(mapt[s2][i]+mapt[i][j]+mapt[j][e2]==mapt[s2][e2])
if(ans<dp[i][j])
ans=dp[i][j];
return ans;
}
int main()
{
int m,a,b,c;
while(scanf("%d%d",&n,&m)>0&&n+m!=0)
{
init();
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(mapt[a][b]>c)
mapt[a][b]=mapt[b][a]=c;
}
int s1,e1,s2,e2;
scanf("%d%d%d%d",&s1,&e1,&s2,&e2);
floyd();
printf("%d\n",findAns(s1,e1,s2,e2));
}
}