杭电ACM1151

来源:互联网 发布:网络电视看电视 编辑:程序博客网 时间:2024/06/06 02:12

今天的第二道匈牙利算法题目。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1151
题目大意:在一个镇子里由街道连接了许多交叉路口,并且这些街道都是单行道,现在要派出士兵巡查所有交叉路口,要求求出最少的士兵数,可以遍历所有交叉路口。
解题思路:在有向无环图中,最小点覆盖=顶点数-最大覆盖。
注意点:因为题目限制所有顶点都大于0,因此遍历时,循环下标应从1开始,读题不细,在这个上面卡了几次……

//AC代码:#include <iostream>#include <string.h>using namespace std;#define MAX 125bool used[MAX];int linked[MAX];int g[MAX][MAX];int n;bool dfs(int u){    int v;    for(v=1;v<=n;v++)    {        if(g[u][v]&&!used[v])        {            used[v] = true;            if(linked[v]==-1||dfs(linked[v]))            {                linked[v] = u;                return true;            }        }    }    return false;}int hungry(){    int u;    int res=0;    memset(linked,-1,sizeof(linked));    for(u=1;u<=n;u++)    {        memset(used,0,sizeof(used));        if(dfs(u))res++;    }    return res;}int main(){    int t;    int count;    int u,v;    while(cin>>t)    {        for(int i=0;i<t;i++)        {            memset(g,0,sizeof(g));            cin>>n>>count;            for(int j=0;j<count;j++)            {                cin>>u>>v;                g[u][v] = 1;            }            cout<<n-hungry()<<endl;        }    }    return 0;       }
0 0
原创粉丝点击