奇奇怪怪的算法,90分WA了,求助
查看原帖
奇奇怪怪的算法,90分WA了,求助
227438
The_World_exe楼主2020/10/15 21:30
#include<iostream>
#include<cstdio>
#include<algorithm>
const int N=1005;
const int M=5e4+5;
using namespace std;
int n1,n2,m,ans;
int fir[N],cur[N],cnt;
int b[N];//b[i]代表与右部点i相连的左部点编号为b[i]
struct edge
{
    int v,nxt;
}e[M];

void add(int u,int v)
{
    e[++cnt].v=v;
    e[cnt].nxt=fir[u];
    fir[u]=cnt;
}
bool found(int x)
{
    for(int i=cur[x];i!=0;i=e[i].nxt)
    {
        cur[x]=i;//类似于弧优化?总之不加这一行,最后三个点都会T飞。加上这个之后就不T了,但是第5个点还是WA
        int to=e[i].v;
        if(b[to]==0)
        {
            b[to]=x;
            return 1;
        }
        else if(b[to]<x)
        {
            int tmp=b[to];
            b[to]=x;
            if(found(tmp)==1)return 1;
            else if(found(tmp)==0)b[to]=tmp;
        }
    }
    return 0;
}

int main()
{
    scanf("%d%d%d",&n1,&n2,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
    }
    for(int i=1;i<=n1;i++)cur[i]=fir[i];
    for(int i=1;i<=n1;i++)
    {
        if(found(i)==1)ans++;
    }
    printf("%d\n",ans);
    return 0;
}
2020/10/15 21:30
加载中...