给出无向图G,边 (Ai,Bi)的权是Ci,判断下列性质是否成立:
对于任意圈C,其边权的异或和是0
第1 行,1 个整数T,表示数据的组数。
每组数据第1 行,2 个整数 N,M,表示图G 点和边的数量。
M 行,每行3 个整数 Ai,Bi,Ci,
对每个数据输出一行,“Yes” 或者“No”
2
3 3
1 2 1
2 3 2
3 1 3
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
没了
#include
#include
#include
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;
}