I - Strategic Game - hdu 1054(最小点覆盖)

题意:用最小的点来覆盖全部的边,因为二分图里面最大的匹配就是最小覆盖,所以直接匹配一下即可

***********************************************************************

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

const int MAXN = 1505;
const int oo = 1e9+7;

struct Edge{int v, next;}e[MAXN*4];///数组开小RE了一次
int Head[MAXN], cnt;

int Mx[MAXN], My[MAXN];
int dx[MAXN], dy[MAXN];
int used[MAXN], N, depth;

void InIt()
{
    cnt = 0;
    memset(Head, -1, sizeof(Head));
    memset(Mx, -1, sizeof(Mx));
    memset(My, -1, sizeof(My));
}
void AddEdge(int u, int v)
{
    e[cnt].v = v;
    e[cnt].next = Head[u];
    Head[u] = cnt++;
}
bool BFS()
{
    queue<int> Q;
    depth = oo;

memset(dx, false, sizeof(dx));
    memset(dy, false, sizeof(dy));

for(int i=0; i<N; i++)
    {
        if( Mx[i] == -1 )
        {
            dx[i] = true;
            Q.push(i);
        }
    }

while(Q.size())
    {
        int u = Q.front();Q.pop();

if(dx[u] > depth)break;

for(int j=Head[u]; j!=-1; j=e[j].next)
        {
            int v = e[j].v;
            if( dy[v] == false )
            {
                dy[v] = dx[u] + 1;
                if(My[v] == -1)
                    depth = dy[v];
                else
                {
                    dx[ My[v] ] = dy[v] + 1;
                    Q.push( My[v] );
                }
            }
        }
    }

return depth != oo;
}
bool DFS(int i)
{
    for(int j=Head[i]; j!=-1; j=e[j].next)
    {
        int v = e[j].v;
        if( used[v] == false && dx[i] == dy[v]-1 )
        {
            used[v] = true;
            if(My[v] != -1 && dy[v] == depth)
                continue;
            if(My[v] == -1 || DFS(My[v]))
            {
                My[v] = i;
                Mx[i] = v;

return true;
            }
        }
    }

return false;
}
int Karp()
{
    int ans = 0;

while( BFS() == true)
    {
        memset(used, false, sizeof(used));
        for(int i=0; i<N; i++)
        {
            if( Mx[i] == -1 && DFS(i) )
                ans ++;
        }
    }

return ans;
}

int main()
{
    while(scanf("%d", &N) != EOF)
    {
        int M, i, u, v;

InIt();

for(i=0; i<N; i++)
        {
            scanf("%d:(%d)", &u, &M);
            while(M--)
            {
                scanf("%d", &v);
                AddEdge(u, v);
                AddEdge(v, u);
            }
        }

int ans = Karp();

printf("%d\n", ans/2);
    }

return 0;
}

时间: 2024-10-03 00:41:40

I - Strategic Game - hdu 1054(最小点覆盖)的相关文章

hdu 1054 最小点覆盖

Sample Input 4 0:(1) 1 1:(2) 2 3 2:(0) 3:(0) 5 3:(3) 1 4 2 1:(1) 0 2:(0) 0:(0) 4:(0) Sample Output 1 2 最小点覆盖=最大匹配数 水题,懒的拍了 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<vector>

poj1463 Strategic game 树的最小点覆盖

http://poj.org/problem?id=1463 Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 6413   Accepted: 2973 Description Bob enjoys playing computer games, especially strategic games, but sometimes he cannot find the solution fast

hdu 1150 最小点覆盖

题目大意;有两台机器A和B以及N个需要运行的任务.每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行.如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需要设置为模式yi.每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次.请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少. 注意状态为0的即可 1 #include<cstdio> 2 #include<algorithm> 3 #include<

hdu 3360 最小点覆盖

题意:给你一个图,图中有宝物和保安两种元素.每个宝物需要周围的某些位置同时安放保安(如果那些位置有宝物,可以把宝物替换成保安)问你最少需要再安置多少保安,可以使所有宝物满足要求. 题意有点难懂 链接:点我 直接建无向图,少判断个奇偶性,最后除个2即可 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath>

Strategic Game HDU - 1054

#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define N 10100 int vis[N], h[N], used[N], maps[1510][1510], n, ans; int e[N],ne[N],idx; void add(int a, int b) { e[idx]=b; ne[idx]=h[a];

hdu 1054 Strategic Game 二分图最小点覆盖

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题意: 给出一个无向图,求最小点覆盖. 思路: 用网络流来做设立一个超级源点和一个超级汇点. 每个点拆成i和i'. 从超级源点向点i连一条边,容量为1. 从i’向超级汇点连一条边,容量为1. 从i向i'连一条边,容量为正无穷. 然后求最小割/2.因为拆点拆成了2个. 也可以用二分图匹配来做,也是求出最大匹配然后/2. 1 #include <bits/stdc++.h> 2 using na

HDU 1054 Strategic Game 最小点覆盖

 最小点覆盖概念:选取最小的点数覆盖二分图中的所有边. 最小点覆盖 = 最大匹配数. 证明:首先假设我们求的最大匹配数为m,那么最小点覆盖必然 >= m,因为仅仅是这m条边就至少需要m个点.然后假如我们已经求得最小覆盖点集,那么在点集中每个点必然有着这样的性质,在于它相连的边里面,一定有一条边的端点不在最小点集中,因为如果连一条这样的边都没有,那这个点完全没有在最小点集的必要,我们任意选取这样的一条边,一定可以形成一个匹配,匹配数与最小点集中的点的个数相等,但现在这仅仅是一个匹配,他必然小于最大

hdu 1054 Strategic Game (最小顶点覆盖+稀疏图)

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4889    Accepted Submission(s): 2225 Problem Description Bob enjoys playing computer games, especially strategic games, but some

HDU1054 Strategic Game(最小点覆盖)

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10153    Accepted Submission(s): 4744 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 Description: Bob enjoys playing compute