题目
Time Limit: 1sec Memory Limit:256MB
Description
输入一个简单无向图,求出图中连通块的数目。
Input
输入的第一行包含两个整数n和m,n是图的顶点数,m是边数。1<=n<=1000,0<=m<=10000。
以下m行,每行是一个数对v y,表示存在边(v,y)。顶点编号从1开始。
Output
单独一行输出连通块的数目。
Sample InputCopy
5 3
1 2
1 3
2 4
Sample OutputCopy
2
Problem Source: 刘晓铭
学习
输入一个简单无向图,求出图中连通块的数目
输入顶点数,边数。1<=n<=1000,0<=m<=10000。
以下m行,表示存在边(v,y)。注意顶点编号从1开始。
代码
#include<iostream>
using namespace std;
int vers, edges;
void DFS(int v, int * visited, int ** matrix)
{
visited[v] = 1;
for(int i = 0; i < vers; ++i)
{
if((!visited[i]) && matrix[v][i])
{
DFS(i, visited, matrix);
}
}
}
int main()
{
//输入
cin >> vers >> edges;
//初始化
int ** matrix = new int*[vers];
for(int i = 0; i < vers; ++i)
matrix[i] = new int[vers];
for(int i = 0; i < vers; ++i)
{
for(int j = 0; j < vers; ++j)
{
matrix[i][j] = 0;
// cout << matrix[i][j] << " ";
}
// cout << endl;
}
int * visited = new int[vers];
for(int i = 0; i < vers; ++i)
{
visited[i] = 0;
// cout << visited[i] << " ";
}
//输入边
for(int i = 0; i < edges; ++i)
{
int a, b;
cin >> a >> b;
matrix[a - 1][b - 1] = matrix[b - 1][a - 1] = 1;//!!!!题中的边是从1开始
// cout << matrix[a][b];
}
int blo = 0;
for(int i = 0; i < vers; ++i)
{
if(!visited[i])
{
blo++;
DFS(i, visited, matrix);
}
}
cout << blo << endl;
return 0;
}
< /textarea>