zoukankan      html  css  js  c++  java
  • Luogu P1892 P1525 团伙 关押罪犯

    (怎么都是抓罪犯 怪不得写法差不多)

    团伙 关押罪犯

    并查集。以“敌人的敌人是朋友”的思路来处理。所以增加一个e/E数组来存储敌人。

    关押罪犯还用到了贪心的思路。将冲突值从大到小排序,如果当前敌对两点在同一集合,直接输出。

    团伙:

    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int n,m;
    #define MAXN 1001
    int f[MAXN];
    int ex[MAXN]={};
    void init()
    {
        scanf("%d%d",&n,&m);
        getchar();
        for (int i=1;i<=n;i++)
        {
            f[i]=i;
        }
        return;
    }
    int found(int x)
    {
        if (f[x]==x) return x;
        return f[x]=found(f[x]);
    }
    inline void unionn(int x,int y)
    {
        f[found(f[x])]=found(y);
        return;
    }
    int uni()
    {
        int ans=0;
        char z;
        for (int i=1,x,y;i<=m;i++)
        {
            cin>>z;
            scanf("%d%d",&x,&y);
            if (z=='F')
            {
                unionn(x,y);
                continue;
            }
            if ((!ex[x])&&(!ex[y]))
            {
                ex[x]=y;
                ex[y]=x;
                continue;
            }
            if (!ex[x])
            {
                ex[x]=f[y];
                unionn(x,ex[y]);
                continue;
            }
            if (!ex[y])
            {
                ex[y]=f[x];
                unionn(y,ex[x]);
                continue;
            }
            f[found(f[y])]=found(ex[x]);
            f[found(f[x])]=found(ex[y]);
        }
        for (int i=1;i<=n;i++)
        {
            if (f[i]==i)
            {
                ans++;
            }
        }
        return ans;
    }
    int main()
    {
        init();
        cout<<uni();
        return 0;
    }
    

    关押罪犯:

    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #define MAXN 20005
    #define MAXM 100005 
    using namespace std;
    struct naiv
    {
        int a,b,c;
    }e[MAXM];
    int n,m;
    int f[MAXN];
    int E[MAXN]={};
    bool cmp(naiv x,naiv y)
    {
        return x.c>y.c;
    }
    int find(int x)
    {
        if (f[x]==x) return x;
        return f[x]=find(f[x]);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=n;i++)
        {
            f[i]=i;
        }
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
        }
        sort(e+1,e+m+1,cmp);
        for (int i=1;i<=m;i++)
        {
            if (find(e[i].a)==find(e[i].b))
            {
                printf("%d",e[i].c);
                return 0;
            }
            if (!E[e[i].a])
            {
                E[e[i].a]=e[i].b;
            }
            else
            {
                f[find(E[e[i].a])]=find(e[i].b);
            }
            if (!E[e[i].b])
            {
                E[e[i].b]=e[i].a;
            }
            else
            {
                f[find(E[e[i].b])]=find(e[i].a);
            }
        }
        printf("0");
        return 0;
    }
    
  • 相关阅读:
    SQL列类型
    垂直显示查询结果
    在mysql中如何写注释语句
    离开Autodesk,开启新篇章
    Autodesk 为其云技术发布新品牌- Autodesk Forge
    Using View and Data API with Meteor
    View and Data API Tips: Constrain Viewer Within a div Container
    View and Data API Tips: Hide elements in viewer completely
    View and Data API Tips : Conversion between DbId and node
    使用AxisHelper帮助理解View and Data API中的坐标系统
  • 原文地址:https://www.cnblogs.com/Kan-kiz/p/10625560.html
Copyright © 2011-2022 走看看