题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2833
题意:悟空有一个起点终点,唐僧有一个起点终点,求他俩最短路径上最多
的交点个数。
分析:首先要知道它们的最多交点一定是一段连续的路径,因为如果不是连续的
则说明存在其他最短路段,都最短而最多交点不连续矛盾,我表达力不强不信就
试试。
然后可以用floyd跑全图的最短路,并且记录任意两点间的最多节点个数,最后
早出悟空的唐僧相交路段的起点和终点就可以了
现上代码:
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int maxn=300+10; const int inf=1000000; int dis[maxn][maxn],num[maxn][maxn],n,m; int main() { int s1,s2,t1,t2,u,v,w; 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) dis[i][j]=0; else dis[i][j]=inf; num[i][j]=0; } while(m--) { scanf("%d%d%d",&u,&v,&w); if(w<=dis[u][v]) { dis[u][v]=dis[v][u]=w; num[u][v]=num[v][u]=1; } } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(dis[i][j]<dis[i][k]+dis[k][j]) continue; if(dis[i][j]>dis[i][k]+dis[k][j]) { dis[i][j]=dis[i][k]+dis[k][j]; num[i][j]=num[i][k]+num[k][j]; } else if(num[i][j]<num[i][k]+num[k][j]) { num[i][j]=num[i][k]+num[k][j]; } } scanf("%d%d%d%d",&s1,&t1,&s2,&t2); int ans=-1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(num[i][j]>ans &&dis[s1][t1]==dis[s1][i]+dis[i][j]+dis[j][t1] &&dis[s2][t2]==dis[s2][i]+dis[i][j]+dis[j][t2]) { ans=num[i][j]; } } printf("%d\n",ans+1); } return 0; }
时间: 2024-10-13 22:39:19