大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,只是说与谁是不是同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗?
输入
包含多组测试用例。
对于每组测试用例:
第一行包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*(N-1)/2),代表现有N个人(用1~N编号)和M组关系;
在接下来的M行里,每行包括3个整数,a,b, c,如果c为1,则代表a跟b是同乡;如果c为0,则代表a跟b不是同乡;
已知1表示小赛本人。
样例输入
3 1
2 3 1
5 4
1 2 1
3 4 0
2 5 1
3 2 1
输出
对于每组测试实例,输出一个整数,代表确定是小赛同乡的人数。
样例输出
0
3
解法:向上找祖先法。
#include <iostream>
#include <typeinfo>
#include <string>
#include <vector>
#include <cstring>
using namespace std;
int main()
{
int N,M;
while(cin>>N>>M){
vector<int> connect(N,-2);
connect[0] = -1;
for(int i=0;i<M;i++){
int a,b,c;
cin>>a>>b>>c;
if(a<b && c == 1){
if(connect[b-1] < 0)
connect[b-1] = a-1;
else
connect[a-1] = connect[b-1];
}
if(a>b && c == 1){
if(connect[a-1] < 0)
connect[a-1] = b-1;
else
connect[b-1] = connect[a-1];
}
}
int count = 0;
for(int i=1;i<N;i++){
int j = i;
while(j != -2){
j = connect[j];
if(j == -1){
count++;
break;
}
}
}
cout<<count<<endl;
}
return 0;
}