问题 A: 第一题
时间限制: 1 Sec 内存限制: 32 MB
献花: 66 解决: 8
[献花][花圈][TK题库]
题目描述
该题的目的是要你统计图的连通分支数。
输入
每个输入文件包含若干行,每行两个整数i,j,表示节点i和j之间存在一条边。
输出
输出每个图的联通分支数。
样例输入
1 4
4 3
5 5
样例输出
2
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int MaxN = 1000010;
vector<int> map[MaxN];
bool visited[MaxN];
void DFS(int id)
{
visited[id] = true;
for (int i = 0; i < map[id].size(); ++i)
{
if (visited[map[id][i]] == false)
DFS(map[id][i]);
}
}
int main()
{
#ifdef _DEBUG
freopen("data.txt", "r+", stdin);
#endif // _DEBUG
int a, b, N = 0,Max = -1;
while (cin >> a >> b)
{
if (a != b)
{
map[a].push_back(b);
map[b].push_back(a);
}
else
map[a].push_back(b);
Max = max(Max, a);
Max = max(Max, b);
}
for (int i = 1; i <= Max; ++i)
{
if (!visited[i] && map[i].size())
{
++N;
DFS(i);
}
}
cout << N;
return 0;
}
/**************************************************************
Problem: 1798
User: Sharwen
Language: C++
Result: 升仙
Time:366 ms
Memory:29952 kb
****************************************************************/