
2 6 I 0 1 3 Q 1 0 Q 2 1 0 I 0 2 Q 1 1 Q 1 0 3 3 I 0 1 6 I 0 2 2 Q 2 1 2 2 4 I 0 1 7 Q 2 0 1 I 0 1 8 Q 2 0 1 0 0
Case 1: I don‘t know. 3 1 2 Case 2: 4 Case 3: 7 The first 2 facts are conflicting.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <list>
#include <algorithm>
#include <climits>
using namespace std;
#define lson 2*i
#define rson 2*i+1
#define LS l,mid,lson
#define RS mid+1,r,rson
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define N 20005
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define lowbit(x) (x&-x)
const int mod = 1e9+7;
int n,m,tot;
int father[N],r[N],num[N],u,v,w,vis[N];
char str[100];
int find(int x)
{
    if(x!=father[x])
    {
        int fx = father[x];
        father[x] = find(father[x]);
        r[x]^=r[fx];
    }
    return father[x];
}
bool Union(int a,int b,int c)
{
    int fa = find(a),fb=find(b);
    if(fa==fb)
    {
        if((r[a]^r[b])!=c) return false;
        return true;
    }
    if(fa==n) swap(fa,fb);
    father[fa] = fb;
    r[fa] = r[a]^r[b]^c;
    return true;
}
int query()
{
    int i,j,cnt,ans = 0;
    MEM(vis,0);
    for(i = 0; i<tot; i++)
    {
        if(vis[i]) continue;
        cnt = 0;
        int root = find(num[i]);
        for(j = i; j<tot; j++)
        {
            if(!vis[j] && root == find(num[j]))
            {
                vis[j] = 1;
                cnt++;
                ans^=r[num[j]];
            }
        }
        if(root!=n&&(cnt&1))
        {
            return -1;
        }
    }
    return ans;
}
int main()
{
    int i,j,k,cas = 1;
    while(~scanf("%d%d",&n,&m),n+m)
    {
        printf("Case %d:\n",cas++);
        for(i = 0; i<=n; i++)
        {
            father[i] = i;
            r[i] = 0;
        }
        bool flag = false;
        int fac = 0;
        while(m--)
        {
            scanf("%s",str);
            if(str[0]=='I')
            {
                getchar();
                gets(str);
                fac++;
                int cnt = 0;
                for(i = 0; str[i]!='\0'; i++)
                {
                    if(str[i]==' ')
                        cnt++;
                }
                if(cnt == 1)
                {
                    sscanf(str,"%d%d",&u,&w);
                    v = n;
                }
                else
                {
                    sscanf(str,"%d%d%d",&u,&v,&w);
                }
                if(flag)
                    continue;
                if(!Union(u,v,w))
                {
                    printf("The first %d facts are conflicting.\n",fac);
                    flag = true;
                }
            }
            else
            {
                scanf("%d",&tot);
                for(i = 0; i<tot; i++)
                    scanf("%d",&num[i]);
                if(flag) continue;
                int ans = query();
                if(ans == -1)
                    printf("I don't know.\n");
                else
                    printf("%d\n",ans);
            }
        }
        printf("\n");
    }
    return 0;
}
HDU3234&&UVA12232&&LA4487:Exclusive-OR(经典带权并查集)
原文:http://blog.csdn.net/libin56842/article/details/46509325