zoukankan      html  css  js  c++  java
  • Elaxia的路线

    Elaxia的路线

    求无向图中,两对点间最短路的最长公共路径。

    四遍spfa标出每条边的标记,然后用拓扑排序跑dp即可。

    exp:拓扑排序可以跑DAG上的dp。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int maxn=1505;
    struct Edge{
    	int fr, to, nxt, v, m1, m2;
    }e[maxn*maxn*2];
    int cnte=1, fir[maxn];
    void addedge(int x, int y, int z){
    	Edge &ed=e[++cnte];
    	ed.fr=x; ed.to=y; ed.nxt=fir[x]; 
    	ed.v=z; fir[x]=cnte; 
    }
    
    //spfa 边要开成4n! 
    int n, m, dis1[maxn], dis2[maxn], q[maxn*maxn], h, t;
    void spfa(int src, int dst, int *dis){
    	memset(dis, 0x3f3f, maxn*4); dis[src]=h=t=0;
    	q[t++]=src; int u, v;
    	while (h<t){
    		u=q[h++];
    		for (int i=fir[u]; i; i=e[i].nxt){
    			v=e[i].to;
    			if (dis[u]+e[i].v<dis[v])
    				dis[v]=dis[u]+e[i].v, q[t++]=v;
    		}
    	}
    }
    
    int in[maxn], f[maxn];
    
    int main(){
    	scanf("%d%d", &n, &m); int x, y, z;
    	int s1, t1, s2, t2;
    	scanf("%d%d%d%d", &s1, &t1, &s2, &t2);
    	for (int i=1; i<=m; ++i){
    		scanf("%d%d%d", &x, &y, &z);
    		addedge(x, y, z); addedge(y, x, z); }
    	spfa(s1, t1, dis1); spfa(t1, s1, dis2);
    	int minm=dis1[t1];  //最短路的长度 
    	for (int i=2; i<=cnte; ++i){
    		if (dis1[e[i].fr]+dis2[e[i].to]+e[i].v==minm)
    			e[i].m1=1;
    		if (e[i].m1) ++in[e[i].to];  //若边在新图中 
    	}
    	spfa(s2, t2, dis1); spfa(t2, s2, dis2);
    	minm=dis1[t2];  //最短路的长度 
    	for (int i=2; i<=cnte; ++i)
    		if (dis1[e[i].fr]+dis2[e[i].to]+e[i].v==minm)
    			e[i].m2=e[i^1].m2=1;  //两边都要标 
    	h=t=0; int u, v;
    	for (int i=1; i<=n; ++i) if (!in[i]) q[t++]=i;
    	while (h<t){
    		u=q[h++];
    		for (int i=fir[u]; i; i=e[i].nxt){
    			if (!e[i].m1) continue;  //必须在新图中 
    			v=e[i].to; --in[v];
    			if (!in[v]) q[t++]=v;
    			f[v]=max(f[v], f[u]+(e[i].m2?e[i].v:0));
    		}
    	}
    	printf("%d
    ", f[t1]);
    	return 0;
    }
    
  • 相关阅读:
    洛谷 P1508 Likecloud-吃、吃、吃
    Codevs 1158 尼克的任务
    2017.10.6 国庆清北 D6T2 同余方程组
    2017.10.6 国庆清北 D6T1 排序
    2017.10.3 国庆清北 D3T3 解迷游戏
    2017.10.3 国庆清北 D3T2 公交车
    2017.10.3 国庆清北 D3T1 括号序列
    2017.10.4 国庆清北 D4T1 财富
    2017.10.7 国庆清北 D7T2 第k大区间
    2017.10.7 国庆清北 D7T1 计数
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/9512154.html
Copyright © 2011-2022 走看看