标签:art problem iss range and end search class 相同
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1800 Accepted Submission(s): 670
/* 如果两条最短路有公共点,公共点一定是连续的。因此只要找两条最短路最长的公共子序列就行。floyd算出每两点之间的最短路 如果s1,e1与s2,e2之间都存在一个最长的路径mp[i][j]满足mp[s1/s2][i]+mp[i][j]+mp[j][e1/e2]==mp[s1/s2][e1/e2],则i到j的 长度就是答案,只要枚举找到这个中间量即可。 */ #include<iostream> #include<cstdio> using namespace std; const int MAX=10000007; int mp[305][305],num[305][305],n,m; int a,b,c,s1,s2,e1,e2; int main() { while(scanf("%d%d",&n,&m)&&(n+m)){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(i==j){ mp[i][j]==0;num[i][j]=1; } else {mp[i][j]=MAX;num[i][j]=2;} } for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c) mp[a][b]=mp[b][a]=c; } scanf("%d%d%d%d",&s1,&e1,&s2,&e2); for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(mp[i][j]>mp[i][k]+mp[k][j]){ mp[i][j]=mp[i][k]+mp[k][j]; num[i][j]=num[i][k]+num[k][j]-1; } else if(mp[i][j]==mp[i][k]+mp[k][j]) num[i][j]=num[i][k]+num[k][j]-1; } } } int tmp=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if((mp[s1][e1]==mp[s1][i]+mp[i][j]+mp[j][e1])&& (mp[s2][e2]==mp[s2][i]+mp[i][j]+mp[j][e2])&&(num[i][j]>tmp)) tmp=num[i][j]; } } printf("%d\n",tmp); } return 0; }
标签:art problem iss range and end search class 相同
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/6285585.html