1. 问题描述
大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是一件多么激动的事。于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小妮尤其热衷。但是大家不告诉他来自哪里,只是说谁是同乡,从所给的信息中你能告诉有多少人是小妮的同乡吗?
2. 输入
每个测试实例首先包括两个整数N( 1≤N≤1000 ), M( 0≤M≤N∗(n−1)/2 )。代表N个人,M组关系。接下来M行,每行两个整数a和b,表示a和b是同乡。当 N=0,且M=0 表示输入结束。已知:1表示小妮本人。
3. 输出
对应每个测试用例输出一个整数,表示小妮的同乡人数。
示例:
输入:
3 1
2 3
5 4
1 2
3 4
2 5
3 2
输出:
0
4
4. 方法与思路
用一个结构体rship保持两个人的关系,保证小号在左边,然后对这个关系数组进行一次排序,再用一个数组标记一下拓扑关系,最后遍历一遍即可。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxn 1000
struct rship
{
int a;
int b;
}r[1000];
int cmp(const void *a, const void *b)
{
const rship* r1 = (const rship*)a;
const rship* r2 = (const rship*)b;
return r1->a - r2->a;
}
int main()
{
int n,m,cnt;
bool mark[maxn];
while(scanf("%d%d",&n,&m)){
if(0 == n && 0 == m) break;
cnt =0;
memset(r,0,sizeof(r));
memset(mark,false,n+1);
for(int i = 0; i < m; i++)
{
scanf("%d%d", &r[i].a, &r[i].b);
if(r[i].a > r[i].b) swap(r[i].a, r[i].b);
}
qsort(r,m,sizeof(rship),cmp);
if(r[0].a != 1)
{
printf("0\n");
continue;
}
mark[r[0].a] = true;
for(int i = 0; i < n; i++)
{
if(mark[r[i].a])
mark[r[i].b] = true;
}
for(int i = 0; i < n; i++)
if(mark[i]) cnt++;
printf("%d\n", cnt);
}
return 0;
}