shuoj_1559

来源:互联网 发布:java高级编程培训 编辑:程序博客网 时间:2024/06/15 09:27

1559: 无向图的连通分支

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 783  Solved: 451
[Submit][Status][Web Board]

Description

输入一个无向图G,计算G的连通分支数。

Input

有多个无向图数据。每个无向描述的第1行是两个整数n和e,分别表示顶点数和边数。接着有e行,每行有2个整数a、b,分别是一条边的两个端点(起点和终点)。两个图之间空一行。

Output

对每个无向图,输出图中连通分支个数。

Sample Input

2 11 25 81 21 31 41 52 32 43 44 5

Sample Output

11


2333  dfs遍历QWQ反正来看的大概率也是我们学校的苦命人2333

如果该点没被走过,那么dfs可以走遍该点可以到达的所有点,这些点是一个连通分支

进行几次dfs就有几个连通块 2333


/*************************************************************************> File Name: shuoj_1559.cpp> Author: > Mail: > Created Time: 2017年04月21日 星期五 02时02分55秒 ************************************************************************/#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<string>#include<vector>#include<set>#include<queue>#include<map>#include<sstream>#include<stack>#include<functional>#include<cctype>using namespace std;typedef long long ll;//thanks to pyf ...//thanks to lmd ...#define INF 0x3f3f3f3f#define N 10000struct Edge{    int u,v;    int next;}edge[N*2];int n;vector<int>G[N];int head[N];int vis[N];int tot=0;int cnt = 0;void init(){    memset(head,-1,sizeof(head));    memset(vis,0,sizeof(vis));    for(int i=0;i<=n;i++)        G[i].clear();    tot = 0;}void add_edge(int u,int v){    G[u].push_back(v);}void dfs(int u){    vis[u] = 1;    for(int i=0;i<G[u].size();i++)    {        int v = G[u][i];        if(!vis[v])            dfs(v);    }}int main(){    int m;    while(scanf("%d%d",&n,&m)==2)    {        for(int i = 0;i<m;i++)        {            int u,v;            scanf("%d%d",&u,&v);            add_edge(u,v);            add_edge(v,u);        }        cnt  = 0;        for(int i = 1;i<=n;i++)        {            if(!vis[i])            {                dfs(i);                cnt ++;            }        }        if(m==0&&n==0)            cnt = 1;        cout << cnt << endl;    }}



0 0
原创粉丝点击