HDU 1054Strategic Game(一般图匹配之最小点覆盖)

来源:互联网 发布:药品销售软件 编辑:程序博客网 时间:2024/06/05 05:27

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1054

这题水题,因为没有明确的二分关系,所以是一般图匹配。所以最终结果需要除以2.还有需要注意的是,用矩阵会超时,可以用链式前向星。还有就是图是无向图。

代码如下:

#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <algorithm>using namespace std;int n, cnt, head[2000], link[2000], vis[2000];struct node{    int u, v, next;}edge[5000];void add(int u, int v){    edge[cnt].v=v;    edge[cnt].next=head[u];    head[u]=cnt++;}int dfs(int u){    int i;    for(i=head[u];i!=-1;i=edge[i].next)    {        if(!vis[edge[i].v])        {            vis[edge[i].v]=1;            if(link[edge[i].v]==-1||dfs(link[edge[i].v]))            {                link[edge[i].v]=u;                return 1;            }        }    }    return 0;}void hungary(){    int i,ans=0;    memset(link,-1,sizeof(link));    for(i=0;i<n;i++)    {        memset(vis,0,sizeof(vis));        if(dfs(i))            ans++;    }    printf("%d\n",ans/2);}int main(){    int m, x, i, y;    while(scanf("%d",&n)!=EOF)    {        memset(head,-1,sizeof(head));        cnt=0;        for(i=0;i<n;i++)        {            scanf("%d:(%d)",&x,&m);            while(m--)            {                scanf("%d",&y);                add(x,y);                add(y,x);            }        }        hungary();    }    return 0;}


0 0
原创粉丝点击