【Codeup 1796】A: 第一题 (图的DFS遍历)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qian2213762498/article/details/82025240

http://codeup.cn/problem.php?cid=100000620&pid=0

问题 A: 第一题

时间限制: 1 Sec  内存限制: 32 MB
提交: 194  解决: 33
[提交][状态][讨论版][命题人:外部导入]

题目描述

该题的目的是要你统计图的连通分支数。

输入

每个输入文件包含若干行,每行两个整数i,j,表示节点i和j之间存在一条边。

输出

输出每个图的联通分支数。

样例输入

1 4
4 3
5 5

样例输出

2

万恶的评测机,就是莫名其妙超时了。

#include <iostream>
#include <cstdio> 
#include <cstring>
#include <vector>
using namespace std;
const int nmax=300010;//5e5+10;
vector<int> G[nmax];
int vis[nmax];

void DFS(int u){
	vis[u]=1;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(vis[v]==0){
			DFS(v);
		}
	}
}
int main(int argc, char** argv) {
    ios_base::sync_with_stdio(false);
    cin.tie(0)
	int n=-1;//点数 
	int u,v;
	while(cin>>u>>v){
		memset(vis,0,sizeof(vis));
		if(u!=v){
			G[u].push_back(v);
			G[v].push_back(u);
		}
		else{
			G[u].push_back(v);
		}
		n=max(n,u);
		n=max(n,v); 
	}
	int blk=0;
	for(int i=1;i<=n;i++){//遍历整个图G 
		if(vis[i]==0&&G[i].size()>0){
			DFS(i);
			blk++;
		} 
	}
	//cout<<blk<<endl;
	printf("%d\n",blk);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qian2213762498/article/details/82025240