LA 3644

来源:互联网 发布:淘宝小号交易 编辑:程序博客网 时间:2024/04/28 23:04

题目链接:http://vjudge.net/contest/view.action?cid=55911#problem/A

                    https://icpcarchive.ecs.baylor.edu/external/36/3644.pdf

 

 

 

 

解题思路:

       题目大意抽象为每行输入a和b,然后将其连成一条边,要求不能成环,成环的那条边要舍去,最后问舍去多少条边。

       并查集模板题······把a和b建立联系,并找到他们的祖先x和y,如果相等,说明构成环了,那么这条边不要,cnt ++,最后输出 cnt 即可。

 

 

 

 

 

 

完整代码:

#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <climits>#include <cassert>#include <complex>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;typedef double DB;typedef unsigned uint;typedef unsigned long long uLL;/** Constant List .. **/ //{const int MOD = int(1e9)+7;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f3f3f3f3f3f3fLL;const DB EPS = 1e-9;const DB OO = 1e20;const DB PI = acos(-1.0); //M_PI;const int maxn = 10000001;int f[maxn];int finds(int x){    return f[x] == x ? x : finds(f[x]);}void init(){    for(int i = 0 ; i <= maxn ; i ++)        f[i] = i;}int main(){    #ifdef DoubleQ    freopen("in.txt","r",stdin);    #endif    int a , b;    while(~scanf("%d",&a))    {        init();        int cnt = 0;        while(a != -1)        {            scanf("%d",&b);            int x = finds(a);            int y = finds(b);            if(x == y)                cnt ++;            else                f[x] = y;            scanf("%d",&a);        }        printf("%d\n",cnt);    }}


 

0 0
原创粉丝点击