设无向图顶点个数为n,边数为m。DFS遍历无向图,找到该无向图连通分量的个数num,则冗余关系数为m-n+num。另外由于此题中顶点数较多而边数较少,采用邻接表存储,提高效率。
以下是我的代码:
#include<iostream>
#include<string.h>
#define maxn 1007
#define maxm 1007
using namespace std;
typedef struct
{
    long v,w;
}edge;
long n,m,num;
long cnt,first[maxn],next[2*maxm];
edge e[2*maxm];
bool used[maxn];
void dfs(long s)
{
    used[s]=true;
    for(long i=first[s];i;i=next[i])
        if(!used[e[i].v])
            dfs(e[i].v);
}
int main()
{
    memset(first,0,sizeof(first));
    memset(next,0,sizeof(next));
    memset(e,0,sizeof(e));
    
    cin>>m>>n;
    cnt=0;
    for(long i=1;i<=m;i++)
    {
        long a,b;
        cin>>a>>b;
        cnt++;e[cnt].v=b;
        next[cnt]=first[a];
        first[a]=cnt;
        cnt++;e[cnt].v=a;
        next[cnt]=first[b];
        first[b]=cnt;
    }
    //  Input
    
    num=0;
    memset(used,false,sizeof(used));
    for(long i=1;i<=n;i++)
        if(!used[i])
        {
            num++;
            dfs(i);
        }
    //  DFS
    
    cout<<m-n+num<<endl;
    //  Output
return 0;
}
	posted on 2010-10-18 15:38 
lee1r 阅读(317) 
评论(1)  编辑 收藏 引用  所属分类: 
题目分类:图论