HDU 2833 WuKong 求两条最短路间最多公共点数

来源:互联网 发布:青年网络公开课 2017 编辑:程序博客网 时间:2024/06/05 18:05

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2833

题意

两个人从两个点出发(不一定是同一个点),到达两个点(不一定是同一个点),问他们的最短路间最多可以有几个公共点。

思路

dp[i][j] 代表I到j这条最短路中最多有几个点。

#include<cstdio>#include<queue>#include<iostream>#include<vector>#include<map>#include<cstring>#include<string>#include<set>#include<stack>#include<algorithm>#define cle(a) memset(a,0,sizeof(a))#define inf(a) memset(a,0x3f,sizeof(a))#define ll long long#define Rep(i,a,n) for(int i=a;i<=n;i++)using namespace std;#define INF2 9223372036854775807llconst int INF = ( 2e9 ) + 2;const ll maxn = 310;int mp[maxn][maxn],dp[maxn][maxn];void Floyd(int n){    for(int k=1;k<=n;k++)    for(int i=1;i<=n;i++)    {        if(mp[i][k]==INF||i==k)continue;        for(int j=1;j<=n;j++)        if(i!=j&&j!=k&&mp[k][j]!=INF)        {            if(mp[i][j]>mp[i][k]+mp[k][j])            {                mp[i][j]=mp[i][k]+mp[k][j];                dp[i][j]=dp[i][k]+dp[k][j]-1;            }            else if(mp[i][j]==mp[i][k]+mp[k][j]&&dp[i][j]<dp[i][k]+dp[k][j])            {                dp[i][j]=dp[i][k]+dp[k][j]-1;            }        }    }}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)&&(n+m))    {        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                mp[i][j]=INF;                dp[i][j]=2;            }            dp[i][i]=1;            mp[i][i]=0;        }        for(int i=0;i<m;i++)        {            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            mp[v][u]=mp[u][v]=min(mp[u][v],w);        }        int s1,t1,s2,t2;        scanf("%d%d%d%d",&s1,&t1,&s2,&t2);        Floyd(n);        int ans=0;        for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)        {            if(mp[s1][i]+mp[i][j]+mp[j][t1]==mp[s1][t1]&&               mp[s2][i]+mp[i][j]+mp[j][t2]==mp[s2][t2])               ans=max(ans,dp[i][j]);        }        if(mp[s1][t1]>=INF||mp[s2][t2]>=INF)ans =0;        printf("%d\n",ans);    }}
原创粉丝点击