約翰有N頭奶牛,有一部分奶牛是真話奶牛,它們只說真話,而剩下的是假話奶牛,只說假話。有一天,約翰從奶牛的閒談中陸續獲得了M句話,第i句話出自第Xi頭奶牛,它會告訴約翰第Yi頭是一頭真話奶牛仍是假話奶牛。然而,約翰記性很差,他可能把這些話的內容記錯了。請檢查一下 約翰的記錄是否會有矛盾,幫助他找到一個儘可能大的K使得約翰記下的前K句話不矛盾。ios
第一行:兩個整數 N 和 M ,1 ≤ N ≤ 1000; 1 ≤ M ≤ 10000
• 第二行到 M + 1 行:第 i + 1 行有兩個整數:Xi 和 Yi,1 ≤ Xi, Yi ≤ N ,接下來有一個字符:
– 若是是 T ,表示 Xi 說 Yi 是真話奶牛;
– 若是是 L,表示 Xi 說 Yi 是假話奶牛;spa
單個整數,即表示題目描述中的Kcode
4 3
1 4 L
2 3 T
4 1 Torm
2blog
解釋
前兩句沒有矛盾, 但第一句和第三句存在矛盾ip
sol:string
題目說的是前k個。。it
並查集判斷,若是一個點爲真或爲假時它的祖先相同,則矛盾了。io
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<cmath> #include<set> using namespace std; const int N=2*1100,M=11000; int n,m,fa[N]; char s[10]; int findfa(int x) { if(fa[x]==x) return x; return findfa(fa[x]); } int main() { // freopen("a.in","r",stdin); freopen("truth.in","r",stdin); freopen("truth.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=2*n;i++) fa[i]=i; int x,y,k=0,bk=1; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); scanf("%s",s); if(s[0]=='L') { fa[findfa(x)]=findfa(n+y); fa[findfa(n+x)]=findfa(y); } else { fa[findfa(x)]=findfa(y); fa[findfa(n+x)]=findfa(n+y); } if(findfa(y)==findfa(n+y)) bk=0; if(bk) k++; } printf("%d\n",k); return 0; }