Time Limit: 4000MS | Memory Limit: 65536K | |
Total Submissions: 4886 | Accepted: 1496 |
Description
USTC campus network is a huge network. There is a bi-directional link between every pair of computers in the network. One of the computers is the BBS server, which is so popular that thousands of people log on it every day. Recently some links of the network are damaged by the rainstorm. The network administrator is going to check which computers are still connected with the BBS server directly or indirectly.
You are to help the administrator to report the number of computers still connecting with the BBS server (not including itself).
Input
The input consists of multiple test cases. Each test case starts with a line containing two integers N and M (1 ≤ N ≤ 10,000, 0 ≤ M ≤ 1,000,000), which are the number of computers and the number of damaged links in USTC campus network, respectively. The computers are numbered from 1 to N and computer 1 is the BBS server.
Each of the following M lines contains two integers A and B(1 ≤ A ≤ N, 1 ≤ B ≤ N, A ≠ B), which means the link between computer A and B is damaged. A link will appear at most once.
The last test case is followed by a line containing two zeros.
Output
For each test case, print a line containing the test case number( beginning with 1) followed by the number of computers still connecting with the BBS server.
Sample Input
3 2 1 2 1 3 4 3 1 2 3 2 4 2 0 0
Sample Output
Case 1: 0 Case 2: 2
Source
题意:有n台电脑,一开始每两台计算机之间都由一条双向的网线连接着,其中一台是BBS服务器。可是,最近网络中的m条网线被破坏了,网络管理员想知道还有多少台计算机直接或间接的连接着服务器。
解题思路:暴力+bitset
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <map>
#include <climits>
#include <bitset>
using namespace std;
#define LL long long
const int INF=0x3f3f3f3f;
bitset<10009>f[10009],k;
int main()
{
int n,m,a,b,cas=0;
while(~scanf("%d %d",&n,&m)&&(n+m))
{
for(int i=1;i<=n;i++) f[i].reset();
for(int i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);
f[a][b]=f[b][a]=1;
}
k.reset();
k[1]=1;
while(k.count()<n)
{
int cnt=0;
for(int i=1;i<=n;i++)
{
if (k[i]||(f[i]&k)==k) continue;
k[i]=1;cnt++;
}
if(!cnt) break;
}
printf("Case %d: %d\n",++cas,k.count()-1);
}
return 0;
}