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;
}
原文地址:https://www.cnblogs.com/Kan-kiz/p/10625560.html