求助大佬,样例8wa了
查看原帖
求助大佬,样例8wa了
903178
coder_want_npy楼主2023/8/2 17:21
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct nod//////////编号相当于每个员工的姓名,负数就是女生,正数就是男生,index相当于他们在数组中的作表 
{
    int index;
    int bianhao;
};
nod fa[100010000];
int n, m, p, q;
void init()
{
    int maxn=max(m,n);
    int k = 0;
    int sum = -maxn;
    for (int i = 1; i <= 2*maxn; i++)///////担心先输入女生公司所以直接扩充位最大值的两倍 
    {
        fa[i].bianhao = sum;
        sum++;
        fa[i].index = i;
    }
}
int find_(int x)/////正常并查集,x是index 
{
    if (x == fa[x].index)
        return x;
    else
        return fa[x].index = find_(fa[x].index);
}
void emerge_(int a, int b)
{
    int fx = find_(a), fy = find_(b);
    if (fx != fy)
        fa[fx].index = fy;
}
int main()
{
    while (scanf("%d %d %d %d", &n, &m, &p, &q)!=EOF)
    {
        int maxn = max(n, m);
        init();
        int flag = 1;
        for (int i = 1; i <= p; i++)///A公司
        {
            int a, b;
            cin >> a >> b;
            int index1, index2;
            for (int i = 1; i <= 2 * maxn; i++)
            {
                if (a == fa[i].bianhao)
                    index1 = i;
                if (b == fa[i].bianhao)
                    index2 = i;
            }
            emerge_(index1, index2);
            if (a < 0)
                flag = 0;
        }
        for (int i = 1; i <= q; i++)/////////B公司 
        {
            int a, b;
            cin >> a >> b;
            int index1, index2;
            for (int i = 1; i <= 2 * maxn; i++)
            {
                if (a == fa[i].bianhao)
                    index1 = i;
                if (b == fa[i].bianhao)
                    index2 = i;
            }
            emerge_(index1, index2);
        }
        int index1, index2;
        for (int i = 1; i <= 2 * maxn; i++)//////////找到-1,-2两人将他们并起来 
        {
            if (-1 == fa[i].bianhao)
                index1 = i;
            if (1 == fa[i].bianhao)
                index2 = i;
        }
        emerge_(index1, index2);
        long long sumgirl = 0;
        long long sumboy = 0;
        for (int i = 1; i <= 2 * maxn; i++)///遍历一遍,连接起来的就会通到 1处,1是祖先那样的 
        {
        	int x=find_(i),y=find_(index2);
            if (find_(i) == find_(index2))////大家有相同的祖先就统计男女人数 
            {
                if (fa[i].bianhao < 0)///bianhao小于0就是女生 
                    sumgirl++;
                else if (fa[i].bianhao > 0)////编号大于0就是男生 
                    sumboy++;
                else;
            }
        }
        long long minm = min(sumgirl, sumboy);
        cout << minm << endl;
    }
}
2023/8/2 17:21
加载中...