信友队集训 D12T1 找数列
题意
一个矩阵 是 01 矩阵,有 个位置的值给定,其余位置任意。问是否存在数组 使得对任意给定值的位置 ,都有 。
分析
由于 为 01 矩阵,所以任意一对 之差不超过 ,那么我们不妨设 全为 或 ,那么 矩阵表述的关系可以转化为异或:
于是把确定的 当成一条连着 的双向边,对这张图进行染色,看是否有矛盾即可。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long read(){
long long x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void write(long long x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=1e5+10;
int n,m,t,vis[N],col[N];
int head[N],ver[N<<1],nxt[N<<1],edge[N<<1],tot;
void add(int x,int y,int z){
ver[++tot]=y;
edge[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
bool dfs(int x){
vis[x]=1;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i],z=edge[i];
if(!vis[y]){
col[y]=col[x]^z;
if(dfs(y))
return 1;
}
else if(col[x]^z!=col[y])
return 1;
}
return 0;
}
int main(){
t=read();
while(t--){
n=read();m=read();
for(int i=1;i<=n;i++)
head[i]=vis[i]=col[i]=0;
tot=0;
for(int i=1;i<=m;i++){
int x,y,z;
x=read();y=read();z=read();
add(x,y,z);add(y,x,z);
}
bool f=0;
for(int i=1;i<=n;i++){
if(!vis[i])
if(dfs(i)){
f=1;
break;
}
}
if(f)
puts("no");
else puts("yes");
}
return 0;
}

浙公网安备 33010602011771号