https://www.luogu.org/problem/show?pid=2149
题目描述
最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间。Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长。 现在已知的是Elaxia和w**所在的宿舍和实验室的编号以及学校的地图:地图上有N个路 口,M条路,经过每条路都需要一定的时间。 具体地说,就是要求无向图中,两对点间最短路的最长公共路径。
输入输出格式
输入格式:
第一行:两个整数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。
输出格式:
一行,一个整数,表示每天两人在一起的时间(即最长公共路径的长度)
输入输出样例
输入样例#1:
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
输出样例#1:
3
说明
对于30%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N ≤ 1500,输入数据保证没有重边和自环。
以给定的4个点跑4遍最短路,
确定每条同时在在于两点间最短路上的边,更新ans
1 #include <cstdlib> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 6 #define max(a,b) (a>b?a:b) 7 #define min(a,b) (a<b?a:b) 8 inline void read(int &x) 9 { 10 x=0; register char ch=getchar(); 11 for(; ch>‘9‘||ch<‘0‘; ) ch=getchar(); 12 for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) x=x*10+ch-‘0‘; 13 } 14 const int INF(0x3f3f3f3f); 15 const int N(1500+5); 16 const int M(2e6+15); 17 int n,m,s1,s2,t1,t2; 18 int head[N],sumedge,hed[N],sum; 19 struct Edge { 20 int v,next,w; 21 Edge(int v=0,int next=0,int w=0):v(v),next(next),w(w){} 22 }edge[M<<1],e[M]; 23 struct Road { 24 int u,v,w; 25 Road(int u=0,int v=0,int w=0):u(u),v(v),w(w){} 26 }road[M]; 27 inline void ins(int u,int v,int w) 28 { 29 edge[++sumedge]=Edge(v,head[u],w); 30 head[u]=sumedge; 31 edge[++sumedge]=Edge(u,head[v],w); 32 head[v]=sumedge; 33 } 34 35 bool vis[N]; 36 int dis[N][5]; 37 struct Node { 38 int pos,dis; 39 Node() { pos=0; dis=0; } 40 bool operator < (const Node &x)const 41 { 42 return dis>x.dis; 43 } 44 }u,v; 45 inline void Dijkstra(int s,int op) 46 { 47 memset(vis,0,sizeof(vis)); 48 std::priority_queue<Node>que; 49 for(int i=1; i<=n; ++i) dis[i][op]=INF; 50 u.pos=s; u.dis=dis[s][op]=0; que.push(u); 51 for(; !que.empty(); ) 52 { 53 u=que.top(); que.pop(); 54 if(vis[u.pos]) continue; vis[u.pos]=1; 55 for(int i=head[u.pos]; i; i=edge[i].next) 56 { 57 v.pos=edge[i].v; 58 if(dis[v.pos][op]>dis[u.pos][op]+edge[i].w) 59 { 60 v.dis=dis[v.pos][op]=dis[u.pos][op]+edge[i].w; 61 que.push(v); 62 } 63 } 64 } 65 } 66 67 int rd[N],val[N],ans; 68 inline void add(int u,int v,int w) 69 { 70 e[++sum]=Edge(v,hed[u],w); 71 hed[u]=sum; rd[v]++; 72 } 73 inline int Top_sort() 74 { 75 int ret=0; 76 std::queue<int>que; 77 for(int i=1; i<=n; ++i) 78 if(!rd[i]) que.push(i); 79 for(int u,v; !que.empty(); ) 80 { 81 u=que.front(); que.pop(); 82 for(int i=hed[u]; i; i=e[i].next) 83 { 84 v=e[i].v; 85 if(val[v]<val[u]+e[i].w) 86 val[v]=val[u]+e[i].w,ret=max(ret,val[v]); 87 if(--rd[v]==0) que.push(v); 88 } 89 } 90 return ret; 91 } 92 93 inline bool check(int x) 94 { 95 return (dis[x][1]+dis[x][3]==dis[t1][1])&&(dis[x][2]+dis[x][4]==dis[t2][2]); 96 } 97 98 int Presist() 99 { 100 read(n),read(m),read(s1); 101 read(t1),read(s2),read(t2); 102 for(int u,v,w,i=1; i<=m; ++i) 103 read(u),read(v),read(w), 104 ins(u,v,w),road[i]=Road(u,v,w); 105 Dijkstra(s1,1); Dijkstra(s2,2); 106 Dijkstra(t1,3); Dijkstra(t2,4); 107 for(int i=1; i<=n; ++i) if(check(i)) 108 for(int j=i+1; j<=n; ++j) if(check(j)) 109 ans=max(ans,std::abs(dis[i][1]-dis[j][1])); 110 printf("%d\n",ans); 111 return 0; 112 } 113 114 int Aptal=Presist(); 115 int main(int argc,char*argv[]){;}
时间: 2024-12-11 13:51:09