zoukankan      html  css  js  c++  java
  • POJ 3169 Layout

    裸差分约束。有两种写法。spfa 和 dfs,dfs 优点在判负环,但递归常数巨大,spfa 优点在快。
    差分约束就是用最短路的思想来接不等式组,具体做法见这篇博客

    #include <bits/stdc++.h>
    using namespace std;
    
    #define db double
    #define ll long long
    #define RG register
    
    inline int gi()
    {
    	RG int ret; RG bool flag; RG char ch;
    	ret=0, flag=true, ch=getchar();
    	while (ch < '0' || ch > '9')
    		ch == '-' ? flag=false : 0, ch=getchar();
    	while (ch >= '0' && ch <= '9')
    		ret=(ret<<3)+(ret<<1)+ch-'0', ch=getchar();
    	return flag ? ret : -ret;
    }
    
    const db pi = acos(-1.0);
    const int N = 1005, M = 2e4+5, inf = 1<<30;
    
    bool vis[N];
    int f[N],dis[N],et[M],nx[M],ed[M];
    int num;
    
    inline void add(int x,int y,int z)
    {
    	nx[++num]=f[x], et[num]=y, ed[num]=z, f[x]=num;
    }
    
    inline void spfa(int o)
    {
    	int i,to,len;
    	vis[o]=true;
    	for (i=f[o]; i; i=nx[i])
    		{
    			to=et[i], len=ed[i];
    			if (dis[to] > dis[o]+len)
    				{
    					if (vis[to])
    						puts("-1"), exit(0);
    					dis[to]=dis[o]+len;
    					spfa(to);
    				}
    		}
    	vis[o]=false;
    }
    
    int main()
    {
    	freopen("layout.in","r",stdin);
    	freopen("layout.out","w",stdout);
    	int n,m,k,i,x,y,z;
    	n=gi(), m=gi(), k=gi();
    	for (i=1; i<=m; ++i)
    		{
    			x=gi(), y=gi(), z=gi();
    			add(x,y,z);
    		}
    	for (i=1; i<=k; ++i)
    		{
    			x=gi(), y=gi(), z=gi();
    			add(y,x,-z);
    		}
    	for (i=2; i<=n; ++i)
    		dis[i]=inf;
    	spfa(1);
    	dis[n] < inf ? printf("%d
    ",dis[n]) : puts("-2");
    	return 0;
    }
    
  • 相关阅读:
    TS的一些小东西
    关于Vue懒加载问题
    react子传父
    MYSQL存储过程以及结果集
    MYSQL视图 事务 游标 索引及其使用
    MYSQL数据库的修复方法MAC
    MYSQL用户授权以及SQL语句
    MySQL数据库基础知识
    JavaScript对象
    JavaScript控制语句
  • 原文地址:https://www.cnblogs.com/y142857/p/7572955.html
Copyright © 2011-2022 走看看