现在的位置: 首页 > 综合 > 正文

POJ 3697 BFS暴力

2017年11月22日 ⁄ 综合 ⁄ 共 2074字 ⁄ 字号 评论关闭
USTC campus network
Time Limit: 4000MS   Memory Limit: 65536K
Total Submissions: 3316   Accepted: 1023

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 ≤ AN, 1 ≤ BN, AB), 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

Source Code

Problem: 3697   User: bingshen
Memory: 12068K   Time: 3641MS
Language: C++   Result: Accepted
  • Source Code

    #include<stdio.h>
    #include<queue>
    #include<vector>
    #include<algorithm>
    #define inf 99999999
    #define maxn 10001
    
    using namespace std;
    
    int n,m;
    vector<int>map[maxn];
    
    void init()
    {
    	int i;
    	for(i=1;i<=n;i++)
    		map[i].clear();
    }
    
    int bfs()
    {
    	int i,now,count=0;
    	bool used[maxn];
    	int pre[maxn];
    	memset(used,0,sizeof(used));
    	memset(pre,0,sizeof(pre));
    	queue<int>q;
    	q.push(1);
    	used[1]=true;
    	while(!q.empty())
    	{
    		now=q.front();
    		q.pop();
    		for(i=0;i<map[now].size();i++)
    			pre[map[now][i]]=now;
    		for(i=1;i<=n;i++)
    		{
    			if(pre[i]!=now&&!used[i])
    			{
    				used[i]=true;
    				count++;
    				q.push(i);
    			}
    		}
    	}
    	return count;
    }
    
    int main()
    {
    	int i,a,b,t=0;
    	while(scanf("%d%d",&n,&m)!=EOF)
    	{
    		if(n==0&&m==0)
    			break;
    		init();
    		for(i=1;i<=m;i++)
    		{
    			scanf("%d%d",&a,&b);
    			map[a].push_back(b);
    			map[b].push_back(a);
    		}
    		int ans=bfs();
    		printf("Case %d: %d/n",++t,ans);
    	}
    	return 0;
    }

抱歉!评论已关闭.