题目描述
最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。
Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。
现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。
解法
对于以四个点为起点,跑四边最短路,重新建图,跑拓扑排序+DP
ac代码
# include <bits/stdc++.h>
# define LL long long
# define ms(a,b) memset(a,b,sizeof(a))
# define ri (register int)
# define inf 0x3f3f3f3f
# define pb push_back
# define dd double
# define fi first
# define se second
# define pii pair<int,int>
# define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
inline int gi(){
int w=0,x=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return w?-x:x;
}
# define M 500005
# define N 1505
struct edge{
int u,to,nt,w;
}E[M<<1],E1[M<<1];
int H[N],H1[N],dist[10][N],a[N],ind[N],ans[N];
bool vis[N];
int n,m,cnt,cnt1,res;
void addedge(int u,int v,int w){
E[++cnt]=(edge){u,v,H[u],w}; H[u]=cnt;
}
void addedge_1(int u,int v,int w){
if (dist[1][u]>dist[1][v]) swap(u,v);
E1[++cnt1]=(edge){u,v,H1[u],w}; H1[u]=cnt1; ind[v]++;
}
void spfa(int id){
queue<int>q;
while (!q.empty()) q.pop();
ms(vis,0);
dist[id][a[id]]=0;
q.push(a[id]);
while (!q.empty()){
int u=q.front(); q.pop(); vis[u]=0;
for (int e=H[u];e;e=E[e].nt){
int v=E[e].to;
if (dist[id][v]>dist[id][u]+E[e].w){
dist[id][v]=dist[id][u]+E[e].w;
if (!vis[v]) vis[v]=1,q.push(v);
}
}
}
}
void topo(){
queue<int>q1; while (!q1.empty()) q1.pop();
for (int i=1;i<=n;i++) if (!ind[i]) q1.push(i);
while (!q1.empty()){
int u=q1.front(); q1.pop();
for (int e=H1[u];e;e=E1[e].nt){
int v=E1[e].to; ind[v]--;
ans[v]=max(ans[v],ans[u]+E1[e].w);
res=max(res,ans[v]);
if (!ind[v]) q1.push(v);
}
}
}
int main(){
n=gi(),m=gi(); ms(dist,inf);
for (int i=1;i<=4;i++) a[i]=gi();
for (int i=1;i<=m;i++){
int u=gi(),v=gi(),w=gi();
addedge(u,v,w); addedge(v,u,w);
}
for (int i=1;i<=4;i++) spfa(i);
for (int i=1;i<=cnt;i+=2){
int u=E[i].u,v=E[i].to;
if((dist[1][u]+E[i].w+dist[2][v]==dist[1][a[2]]||dist[1][v]+E[i].w+dist[2][u]==dist[1][a[2]])&&(dist[3][u]+E[i].w+dist[4][v]==dist[3][a[4]]||dist[3][v]+E[i].w+dist[4][u]==dist[3][a[4]])) addedge_1(u,v,E[i].w);
}
topo();
printf("%d\n",res);
return 0;
}