zstu校赛4191——DFS——无向图找环

Description

给你一副无向图,每条边有边权,保证图联通,现在让你判断这个图是否有异或值大于零的环存在。

Input

多组测试数据,每组先输入两个数n m,表示图的点跟边的数量。

然后是m行,每行三个数a b c。代表一条边的起点,终点,边权。

1 <= n<= 100000, 1 <= m <= 200000.

1 <= a <= n, 1 <= b <= n, a != b.

0 <= c <= 32767

Output

对于每组数据输出Yes或者 No。

Sample Input

3 3
1 2 0
2 3 1
3 1 1

Sample Output

No

HINT

Source

Wuyiqi

大意:用邻接表+DFS,异或环就是这个环里的所有值的异或sum

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX1 = 400100,MAX = 400100;
struct edge{
    int u, v, w, nxt;
}a[MAX];
int head[MAX],sumxor[MAX1];
int vis[MAX1];
int n,m,E;
int u,v,w;
int flag ;
void add(int u,int v,int w){
    a[E].u = u;a[E].v = v;a[E].w = w;a[E].nxt = head[u];
    head[u] = E++;
    a[E].u = v;a[E].v = u;a[E].w = w;a[E].nxt = head[v];
    head[v] = E++;
}
void dfs(int u)
{
    for(int i = head[u]; i != -1; i = a[i].nxt){
        if(!vis[a[i].v]){
            vis[a[i].v] = 1;
            sumxor[a[i].v] = sumxor[u]^a[i].w;
            dfs(a[i].v);
        }
        else {
            if(sumxor[a[i].v]^sumxor[u]^a[i].w){
                flag = 1;
            return ;
            }
        }
    }
}
int main(){
 while(~scanf("%d%d",&n,&m)){
     E = 0;
     flag = 0;
     fill(head,head+n+1,-1);
     fill(vis,vis+n+1,0);
     vis[1] = 1;
     sumxor[1] = 0;
     while(m--){
      scanf("%d%d%d",&u,&v,&w);
      add(u,v,w);
     }
     dfs(1);
    if(flag == 1)
        printf("Yes\n");
    else printf("No\n");
    }
 return 0;
}

时间: 2024-08-25 06:12:38

zstu校赛4191——DFS——无向图找环的相关文章

zstu.4191: 无向图找环(dfs树 + 邻接表)

4191: 无向图找环 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 117  Solved: 34 Description 给你一副无向图,每条边有边权,保证图联通,现在让你判断这个图是否有异或值大于零的环存在. Input 多组测试数据,每组先输入两个数n m,表示图的点跟边的数量. 然后是m行,每行三个数a b c.代表一条边的起点,终点,边权. 1 <= n<= 100000, 1 <= m <= 200000. 1 <

ZSTUOJ 4191 无向图找环(dfs)

中文题 直接dfs下去即可,遇到重复访问的点,判断一下该环三部分异或和是否大于0 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 100005; const int M = 400005; int n, m; struct Edge { int u, v, w; Edge() {} Edge(int u, int v, int

CodeForces 510B 无向图找环的两种方法(搜索与并查集)

题目连接:http://codeforces.com/problemset/problem/510/B 解法: dfs 每次把父节点的值记录并传递下去,判断一下新达到节点: (1)没有走过 → 继续搜索: (2)走过&&不是父节点(对于本题步数也要>=4) → 找到环: 并查集 每个节点映射成 i*m+j从起点开始分别把它下面与于右面的节点加进来,如果发现有节点已经在集合中,那么环已经找到了. DFS: #include<cstdio> #include<cstdl

hdu 6041 I Curse Myself 无向图找环+优先队列

I Curse Myself Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description There is a connected undirected graph with weights on its edges. It is guaranteed that each edge appears in at most one simple cy

逆袭指数-——杭电校赛(dfs)

逆袭指数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 626    Accepted Submission(s): 94 Problem Description 这依然是关于高富帅小明曾经的故事—— 尽管身处逆境,但小明一直没有放弃努力,除了搬砖,小明还研究过东方的八卦以及西方的星座,一直试图在命理上找到自己能够逆袭的依据. 当这些都

搬砖--杭电校赛(dfs)

搬砖 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 4646    Accepted Submission(s): 1060 Problem Description 小明现在是人见人爱,花见花开的高富帅,整天沉浸在美女环绕的笙歌妙舞当中.但是人们有所不知,春风得意的小明也曾有着一段艰苦的奋斗史. 那时的小明还没剪去长发,没有信用卡没有她

HDU - 6370 Werewolf 2018 Multi-University Training Contest 6 (DFS找环)

求确定身份的人的个数. 只能确定狼的身份,因为只能找到谁说了谎.但一个人是否是民,无法确定. 将人视作点,指认关系视作边,有狼边和民边两种边. 确定狼的方法只有两种: 1. 在一个仅由一条狼边组成的环中,狼边指向的那个点必定是狼. 2. 环外指认铁狼为民的也必定是狼. 所以用原图找环求情况1中的铁狼,反向建图找情况2中的狼. #include <bits/stdc++.h> using namespace std; typedef long long LL; const int maxn =1

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第

2014哈商大ICPC/ACM校赛解题报告

被debug邀请去參加校赛,哎,被虐..我对不起工大.. 由于本人不搞ACM,算法处于HelloWorld水准.. 虽然题目除了鸟不拉屎星人之外都非常水,但我能做到这个程度,全然是超水平发挥了.. 数据:点此下载 ============================================================== a:逆序数组+删除特定元素 题目: 小伙伴们好像非常多没接触过ICPC,那先来一道水题尝尝鲜,给出 一个数组,和一个特征值.将这个数组中特征值值删除后逆序输出.