hdu2833WuKong 最短路
来源:互联网 发布:centos rar 安装 编辑:程序博客网 时间:2024/06/05 12:42
Wukong 和tang的最短路径相交的点一定是连续的,
设A,B两点是他们相交的点,又A,B都在这两条最短路上,那么从A到B的最短路能在这两条最短路上,所以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;
}
- hdu2833WuKong 最短路
- 最短路 & 次短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 最短路
- 利用iTunes和iMovie进行音频分割和拼接
- [LeetCode] Permutations II
- 算法优化:从1天到1s
- 实习篇---第十二天
- LINUX C 如何让写文件更快
- hdu2833WuKong 最短路
- python实现session
- day11
- 小白马卫士项目总结之防盗功能的实现
- 数据结构实验:栈实现计算器(表达式计算)
- 华为的JAVA面试题及答案(部分)
- Linux下查看txt文档
- offer那点事
- PB共享变量保持相同的值