bzoj 4500: 矩阵 差分约束

本文通过构建图模型解决了一类特定的图论问题。对于给定的三元组集合,将其转换为带权有向图,并利用DFS遍历检查图的一致性。如果存在违反距离一致性的路径,则判定原问题无解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接


【想说的话】

依旧没有什么想说的...


【题解】

对于每个三元组(x,y,z)

点x向点n+y连接一个权值为z的边

点n+y向x点连接一个权值为-z的边

然后跑dfs

当找到一个访问过的点,并且到这个点的距离与之前记录的距离不一样,那么就一定不合法


【代码】

#include<bits/stdc++.h>

#define mod 1000000007
#define MAXN 2020

typedef long long ll;

using namespace std;

inline int rd(){
	int x=0,y=1;char c=getchar();
	while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*y;
}

struct node{
	int to,len;
	node(int x,int y){to=x,len=y;}
};

int T,n,m,k;
bool vis[MAXN],flag;
int dis[MAXN];
vector<node>v[MAXN];

void pre(){
	memset(vis,0,sizeof(vis));
	memset(dis,0,sizeof(dis));
	for(int i=1; i<=n+m; i++)v[i].clear();
}

void dfs(int x){
	vis[x]=1;
	for(int i=0; i<v[x].size(); i++){
		int to=v[x][i].to;
		int len=v[x][i].len;
		if(!vis[to]){
			dis[to]=dis[x]+len;
			dfs(to);
		}
		else if(vis[to] && dis[to]!=dis[x]+len)flag=false;
	}
}

void work(){
	flag=true;
	n=rd(),m=rd(),k=rd();
	pre();
	for(int i=0; i<k; i++){
		int x=rd(),y=rd(),z=rd();
		v[x].push_back(node(n+y,z));
		v[n+y].push_back(node(x,-z));
	}
	for(int i=1; i<=n+m; i++)if(!vis[i])dfs(i);
	if(!flag)puts("No");
	else puts("Yes");
}

int main(){
	T=rd();
	while(T--)work();
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值