HDU

来源:互联网 发布:淘宝图片怎么ps 编辑:程序博客网 时间:2024/05/20 09:07

HDU - 1083 

题意:就是求最大匹配是否是完美匹配。

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int maxn = 500,maxe = 3e5;struct node{    int to,next;    node(){}    node(int a,int b){to = a; next = b;}}edge[maxe << 1];int edgenum;int h[maxn],used[maxn],belong[maxn];void add(int f,int t){    edge[edgenum] = node(t,h[f]);    h[f] = edgenum++;}void init(){    edgenum = 0;    for(int i = 0; i < maxn; i++)        h[i] = -1, belong[i] = used[i] = 0;}bool Find(int u){    for(int i = h[u]; ~i; i = edge[i].next)    {        int v = edge[i].to;        if(used[v]) continue;        used[v] = 1;        if(belong[v]==0 || Find(belong[v]))        {            belong[v] = u;            return true;        }    }    return false;}int main(){    int t,pnum,v,p,n;    scanf("%d",&t);    while(t--)    {        init();        scanf("%d%d",&p,&n);        for(int i = 1; i <= p ; i++)        {            scanf("%d",&pnum);            for(int j = 0; j < pnum; j++)            {                scanf("%d",&v);                add(i,v+p);   add(v+p,i);            }        }        int ans = 0;        for(int i = 1; i <= p; i++)        {            memset(used,0,sizeof(used));            if(Find(i)) ans ++;        }        ans == p ? printf("YES\n") : printf("NO\n");    }    return 0;}


原创粉丝点击