1. 程式人生 > >[Luogu] P3907 圈的異或

[Luogu] P3907 圈的異或

else 說明 tin 輸入格式 using 題目 tdi cstring ons

題目描述

給出無向圖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; }

  

[Luogu] P3907 圈的異或