[caioj1093]scy的删边问题

  题目描述

【题意】
    读入一个无向图(可能含有多个连通分支),输出最多能删掉多少条边,而不改变这个图任意两点的连通性(原来连通的两个点依然连通,不连通的依然不连通)。 
【输入格式】 
    第一行为图的顶点数N(1≤N≤1000)和边数M(0≤M ≤(N*(N+1)/2) ),它们之间用一个空格隔开,图中的顶点用1到N的整数标号。 
    接下来的M行,每行用两个数v1和v2表示一条边。v1和v2用一个空格隔开,表示这条边所连接的顶点的标号(v1≠v2),同一条边不会重复出现。 
【输出格式】 
    输出最多能删掉的边数。 
【样例输入】
5 7 
4 5 
1 2 
1 3 
1 4 
2 3 
2 4 
3 4 
【样例输出】
3

代码简单得让它像个板子题……重要的是思考方法啊,刚看题面根本就没想到并查集…(趴.
再做做并查集的题再来下笔吧
 
#include<iostream>
using namespace std;
int father[10005];
int find_father(int x)
{
    if (father[x]==x) return x;
    else
    {
        father[x]=find_father(father[x]);
        return father[x];
    }
}
int main()
{
    int n,m,sum=0,a,b;
    cin>>n>>m;
    for (int i=0;i<n;i++) father[i]=i;
    for (int i=0;i<m;i++)
    {
        cin>>a>>b;
        int fa=find_father(a);
        int fb=find_father(b);
        if (fa!=fb)
            father[fa]=fb;
        else//如果这条边不能改变当前图的连通状态,则认为这条边是可以删去的
            sum++;

    }
    cout<<sum;
    return 0;
}
View Code
 

猜你喜欢

转载自www.cnblogs.com/phemiku/p/11435813.html
今日推荐