Description
最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。Elaxia和w**每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。 现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。
Input
第一行:两个整数N和M(含义如题目描述)。 第二行:四个整数x1、y1、x2、y2(1 ≤ x1 ≤ N,1 ≤ y1 ≤ N,1 ≤ x2 ≤ N,1 ≤ ≤ N),分别表示Elaxia的宿舍和实验室及w**的宿舍和实验室的标号(两对点分别 x1,y1和x2,y2)。 接下来M行:每行三个整数,u、v、l(1 ≤ u ≤ N,1 ≤ v ≤ N,1 ≤ l ≤ 10000),表 u和v之间有一条路,经过这条路所需要的时间为l。 出出出格格格式式式::: 一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)。
Output
一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)
Sample Input
9 10
1 6 7 8
1 2 1
2 5 2
2 3 3
3 4 2
3 9 5
4 5 3
4 6 4
4 7 2
5 8 1
7 9 1
Sample Output
3
HINT
对于30%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。
Source
Day2
四遍最短路,然后DP一下
BZOJ炸飞,CodeVS提交的…
天理不容卡评测,还我BZOJ,还我公道!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1510
#define GET (ch>='0'&&ch<='9')
using namespace std;
int n,m,x1,x2,y1,y2,ans;
int f[MAXN],map[MAXN][MAXN],a[MAXN][MAXN];
int dx1[MAXN],dx2[MAXN],dy1[MAXN],dy2[MAXN];
bool vis[MAXN];
void in(int &x)
{
char ch=getchar();x=0;
while (!GET) ch=getchar();
while (GET) x=x*10+ch-'0',ch=getchar();
}
void dijkstra(int s,int *dis)
{
memset(vis,0,sizeof(vis));
for (int i=1;i<=n;i++) dis[i]=0x3f3f3f3f;
dis[s]=0;
for (int i=1;i<=n;i++)
{
int t=0,minn=0x3f3f3f3f;
for (int j=1;j<=n;j++) if (!vis[j]&&dis[j]<minn) t=j,minn=dis[j];
vis[t]=1;
for (int j=1;j<=n;j++) dis[j]=min(dis[j],dis[t]+map[t][j]);
}
}
int dfs(int x)
{
if (vis[x]) return f[x];
vis[x]=1;
for (int i=1;i<=n;i++) if (a[x][i]) f[x]=max(f[x],map[x][i]+dfs(i));
return f[x];
}
int main()
{
in(n);in(m);in(x1);in(y1);in(x2);in(y2);int u,v,w;
memset(map,0x3f,sizeof(map));
for (int i=1;i<=n;i++) map[i][i]=0;
for (int i=1;i<=m;i++) in(u),in(v),in(w),map[u][v]=map[v][u]=w;
dijkstra(x1,dx1);dijkstra(y1,dy1);dijkstra(x2,dx2);dijkstra(y2,dy2);
for (u=1;u<=n;u++) for (v=1;v<=n;v++)
if (u!=v&&dx1[u]+map[u][v]+dy1[v]==dx1[y1]&&(dx2[u]+map[u][v]+dy2[v]==dx2[y2]||dy2[u]+map[u][v]+dx2[v]==dx2[y2]))
a[u][v]=1;
memset(vis,0,sizeof(vis));
for (int i=1;i<=n;i++) ans=max(ans,dfs(i));
printf("%d\n",ans);
}