原题链接: http://acm.hdu.edu.cn/showproblem.php?pid=2463
一:题意
给n个点,标号1到n,每两点有连线,现给出m对关系a b表示a b之间的连线删除,求最后1能连通的点还有多少个。
二:AC代码
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int n, m;
bool vis[10010];
int pre[10010];
vector<int> v[10010];
int solve()
{
queue<int> Q;
vis[1] = 1;
Q.push(1);
int ans = 0;
while (!Q.empty())
{
int x = Q.front();
Q.pop();
for (int i = 0; i < v[x].size(); i++)
pre[v[x][i]] = x;
for (int i = 1; i <= n; i++)
{
if (!vis[i] && pre[i] != x)
{
vis[i] = 1;
Q.push(i);
ans++;
}
}
}
return ans;
}
int main()
{
int cas = 1;
int a, b;
while (~scanf("%d%d", &n, &m) && (n || m))
{
for (int i = 1; i <= n; i++)
v[i].clear();
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &a, &b);
v[a].push_back(b);
v[b].push_back(a);
}
memset(vis, 0, sizeof(vis));
memset(pre, 0, sizeof(pre));
printf("Case %d: %d\n", cas++, solve());
}
return 0;
}