其他分享
首页 > 其他分享> > 2021.07.19 P2294 狡猾的商人(差分约束)

2021.07.19 P2294 狡猾的商人(差分约束)

作者:互联网

2021.07.19 P2294 狡猾的商人(差分约束)

[P2294 HNOI2005]狡猾的商人 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

重点:

1.差分约束最长路与最短路

题意:

给出每个时间段具体账单,分析是否矛盾。

分析:

把每段时间起始时间前挪一个月,把相邻时间段连成连续的时间段,建正向边。如果只建正向边,对于开头是未知账单的来说,没法进行约束,因此建反向边。我们只需要知道所有边是否符合规矩,而不是某个具体的最大值或最小值,所以跑最长路或最短路都可以(亲自试验)。

代码如下:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int inf=0x3f3f3f;
const int N=11000;
int cnt,head[N],t,n,m,dis[N],vis[N],tot[N];
struct node{
	int to,next,val;
}a[N*20];
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
void add(int u,int v,int w){
	++cnt;
	a[cnt].to=v;
	a[cnt].val=w;
	a[cnt].next=head[u];
	head[u]=cnt;
}
int dijkstra(int s){
	queue<int>q;
	//memset(dis,-inf,sizeof(dis));
	//cout<<dis[0]<<endl;//
	for(int i=1;i<=n;i++)dis[i]=inf;
	q.push(s);
	dis[s]=0;
	vis[s]=tot[s]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		//cout<<x<<" ";//
		++tot[x];
		if(tot[x]==n)return 0;
		for(int i=head[x];i;i=a[i].next){
			int v=a[i].to;
			if(dis[v]>dis[x]+a[i].val){
				dis[v]=dis[x]+a[i].val;
				if(!vis[v]){
					q.push(v);
					vis[v]=1;
				}
			}
		} 
	}
	//cout<<endl<<endl;//
	return 1;
}
int main(){
	//freopen("1.txt","r",stdin);
	//freopen("1.out.txt","w",stdout);
	t=read();
	while(t--){
		n=read();m=read();
		cnt=0;
		memset(head,0,sizeof(head));
		memset(vis,0,sizeof(vis));
		memset(tot,0,sizeof(tot));
		//memset(&a,0,sizeof(a));
		for(int i=1;i<=m;i++){
			int u,v,w;
			u=read()-1;v=read();w=read();
			//cout<<u<<" "<<v<<" "<<w<<endl;
			add(u,v,w);
			add(v,u,-w);
		}
		int flag=1;
		for(int i=0;i<=n;i++){
			if(!tot[i]){
				int x=dijkstra(i);
				if(!x){
					flag=0;
					break;
				}
			}
		}
		//for(int i=0;i<=n;i++)cout<<dis[i]<<" ";cout<<endl<<endl;//
		if(flag)cout<<"true"<<endl;
		else cout<<"false"<<endl;
	}
	return 0;
}

标签:cnt,ch,2021.07,val,19,int,include,P2294,dis
来源: https://www.cnblogs.com/eleveni/p/15036474.html