题目描述
最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。
Elaxia和w**每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。
现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。
输入输出格式
输入格式:
第一行:两个整数N和M(含义如题目描述)。
第二行:四个整数x1、y1、x2、y2(1 ≤ x1 ≤ N,1 ≤ y1 ≤ N,1 ≤ x2 ≤ N,1 ≤ y2 ≤ N),分别表示Elaxia的宿舍和实验室及w**的宿舍和实验室的标号(两对点分别 x1,y1和x2,y2)。
接下来M行:每行三个整数,u、v、l(1 ≤ u ≤ N,1 ≤ v ≤ N,1 ≤ l ≤ 10000),表 u和v之间有一条路,经过这条路所需要的时间为l。
输出格式:
一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)
输入输出样例
说明
对于30%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。
最短路好题
跑四边dijkstra +堆优化
找出哪些路是属于两者的共同的最短路 (显然还要反过来枚举一遍 因为枚举的是有向路 )
建立一个新图 跑拓扑 找出最大值
#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define inf 0x3f3f3f3f const int N=1500+5; const int M=10000*N; int n,m,ans; int dis[5][N],vis[N],in[N]; int head[M],head2[M],pos,pos2; struct Edge { int v,to,nex; }edge[M],edge2[M]; void add(int a,int b,int c) { edge[++pos].nex=head[a]; head[a]=pos; edge[pos].v=c; edge[pos].to=b; } void add1(int a,int b,int c) { edge2[++pos2].nex=head2[a]; head2[a]=pos2; edge2[pos2].v=c; edge2[pos2].to=b; } struct node { int id,d; node(){} node(int a,int b):id(a),d(b){} bool operator< (const node& rhs)const { return d>rhs.d; } }; void dijkstra(int x,int s) { rep(i,1,n) dis[x][i]=inf,vis[i]=0; dis[x][s]=0; priority_queue<node>q; q.push( node(s,0) ); while(!q.empty()) { node u=q.top();q.pop(); if(vis[u.id])continue; vis[u.id]=1; for(int i=head[u.id];i;i=edge[i].nex) { int v=edge[i].to; if(dis[x][u.id]+edge[i].v<dis[x][v]) { dis[x][v]=edge[i].v+dis[x][u.id]; q.push(node(v,dis[x][v])); } } } } void to() { queue<int>q; int d[N]; CLR(d,0); rep(i,1,n) if(!in[i])q.push(i); while(!q.empty()) { int u=q.front();q.pop(); for(int i=head2[u];i;i=edge2[i].nex) { int v=edge2[i].to; d[v]=max(d[v],d[u]+edge2[i].v); ans=max(ans,d[v]); if(--in[v]==0) q.push(v); } } } int main() { RII(n,m); int x1,x2,y1,y2; RII(x1,y1);RII(x2,y2); while(m--) { int a,b,c;RIII(a,b,c); add(a,b,c);add(b,a,c); } dijkstra(1,x1); dijkstra(2,y1); dijkstra(3,x2); dijkstra(4,y2); rep(i,1,n) { for(int j=head[i];j;j=edge[j].nex) { if( dis[1][i]+edge[j].v+dis[2][edge[j].to]==dis[1][y1] ) { if(dis[3][ edge[j].to ]+edge[j].v+dis[4][i]==dis[3][y2] ) add1( edge[j].to,i,edge[j].v ),in[i]++; } } } ans=0; to(); CLR(head2,0);pos2=0; rep(i,1,n) { for(int j=head[i];j;j=edge[j].nex) { if( dis[1][i]+edge[j].v+dis[2][edge[j].to]==dis[1][y1] ) { if(dis[3][ i ]+edge[j].v+dis[4][ edge[j].to ]==dis[3][y2] ) add1( i,edge[j].to,edge[j].v ),in[edge[j].to]++; } } } to(); cout<<ans; return 0; }