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;
    }
    
  • 相关阅读:
    vmware导出为ovf
    华三接入交换机推荐
    mysql root情况
    ospf精确宣告地址
    kubernetes k8s yum localinstall
    js判断邮箱、用户名、手机号码和电话号码是否输入正确?
    如何修改Oracle中表的字段长度?
    mybatis与hibernate区别
    SSM框架的优势?
    SSH框架的优势?
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/9512154.html
Copyright © 2011-2022 走看看