题目描述
给出无向图G,边 (Ai,Bi)的权是Ci,判断下列性质是否成立:
对于任意圈C,其边权的异或和是0
输入输出格式
输入格式:
第1 行,1 个整数T,表示数据的组数。
每组数据第1 行,2 个整数 N,M,表示图G 点和边的数量。
M 行,每行3 个整数 Ai,Bi,Ci,
输出格式:
对每个数据输出一行,“Yes” 或者“No”
输入输出样例
输入样例#1:
2 3 3 1 2 1 2 3 2 3 1 3 1 1 1 1 1
输出样例#1:
Yes No
说明
• 对于50% 的数据, N,M≤20
• 对于100% 的数据, 1 <= N,M <= 50 , 1 <= Ai,Bi <= N , 0 <= Ci < 2^16
思路解析
一看数据范围,决定暴力。 枚举每个点,然后dfs,如果回到这个点自己,就判断异或和是不是0 没了
code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN =
55;
const int MAXM =
55;
int n,m,T;
struct Edge {
int next;
int to,w;
} l[MAXM<<
1];
int head[MAXN],cnt=
1;
bool vis[MAXN],flag;
bool v[MAXM];
inline void add(
int x,
int y,
int z) {
cnt++;
l[cnt].next = head[x];
l[cnt].to = y;
l[cnt].w = z;
head[x] = cnt;
return;
}
inline void dfs(
int x,
int from,
int sum,
int syqAK) {
if(flag)
return;
if(vis[x]) {
if(sum && x == syqAK) flag =
true;
return;
}
vis[x] =
true;
for(
register int i = head[x];i;i = l[i].next) {
if(l[i].to == from || v[i])
continue;
v[i] = v[i ^
1] =
true;
dfs(l[i].to,x,(sum xor l[i].w),syqAK);
}
}
int main() {
scanf(
"%d",&T);
while(T--) {
scanf(
"%d%d",&n,&m);
int x,y,z;
for(
int i =
1;i <= m;i++) {
scanf(
"%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
for(
int i =
1;i <= n;i++) {
dfs(i,
0,
0,i);
memset(vis,
0,
sizeof(vis));
memset(v,
0,
sizeof(v));
}
if(flag)
printf(
"No\n");
else printf(
"Yes\n");
memset(head,
0,
sizeof(head));
flag =
0;
cnt =
0;
}
return 0;
}