• [HNOI2005]狡猾的商人


    题目:洛谷P2294、BZOJ1202。

    题目大意:有n个月,m条信息,每条信息告诉你从第u月到第v月(含u和v)的收入是t。问能否满足所有信息。

    解题思路:设$s_i$为第i个月的收入,则每条信息就是告诉你$s_v-s_{u-1}=t$。

    我们把信息拆分为两条:$s_v-s_{u-1}leq t$和$s_{u-1}-s_vleq -t$。

    然后就是差分约束。

    SPFA判负环即可。

    C++ Code:

    #include<cstdio>
    #include<cctype>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int n,m,cnt,head[155],dis[155];
    bool vis[155];
    struct edge{
    	int to,dis,nxt;
    }e[50000];
    bool dfs(int now){
    	for(int i=head[now];i!=-1;i=e[i].nxt)
    	if(dis[e[i].to]>dis[now]+e[i].dis){
    		dis[e[i].to]=dis[now]+e[i].dis;
    		if(!vis[e[i].to]){
    			vis[e[i].to]=true;
    			if(!dfs(e[i].to))return false;
    			vis[e[i].to]=false;
    		}else return false;
    	}
    	return true;
    }
    inline int readint(){
    	char c=getchar();
    	bool b=false;
    	for(;!isdigit(c);c=getchar())b=c=='-';
    	int d=0;
    	for(;isdigit(c);c=getchar())
    	d=(d<<3)+(d<<1)+(c^'0');
    	return b?-d:d;
    }
    int main(){
    	ios::sync_with_stdio(false);
    	for(int t=readint();t--;){
    		memset(head,-1,sizeof head);
    		memset(e,0,sizeof e);
    		cnt=0;
    		n=readint();
    		for(m=readint();m--;){
    			int u=readint(),v=readint(),t=readint();
    			e[++cnt]=(edge){u-1,-t,head[v]};
    			head[v]=cnt;
    			e[++cnt]=(edge){v,t,head[u-1]};
    			head[u-1]=cnt;
    		}
    		for(int i=0;i<=n;++i){
    			e[++cnt]=(edge){i,0,head[n+1]};
    			head[n+1]=cnt;
    		}
    		memset(dis,0x3f,sizeof dis);
    		memset(vis,0,sizeof vis);
    		dis[n+1]=0;
    		vis[n+1]=true;
    		cout<<boolalpha<<dfs(n+1)<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    自动安装rpm依赖
    goroutine上下文contxt语法
    goroutine 上下文用法
    Template Method 模式
    设计模式2--设计原则
    centos7关机自动进行远程服务器备份
    实用工具使用
    剑指offer python版 滑动窗口的最大值
    剑指offer python版 左旋转字符串
    剑指offer python版 翻转单词顺序
  • 原文地址:https://www.cnblogs.com/Mrsrz/p/7944385.html
Copyright © 2020-2023  润新知