hdu 1504最小点集覆盖

这题先用邻接矩阵打了试,TLE,改成邻接表,就过了。。

/*
 * hdu1054/win.cpp
 * Created on: 2012-8-14
 * Author    : ben
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
const int MAXN = 1600;
int N, mymatch[MAXN], temp[MAXN];
vector<int> mymap[MAXN];
bool visited[MAXN];
void init() {
    for(int i = 0; i < N; i++) {
        mymap[i].clear();
    }
}
bool dfs(int k) {
    int t, I;
    for(int i = 0; i < (int)mymap[k].size(); i++) {
        I = mymap[k][i];
        if(!visited[I]) {
            visited[I] = true;
            t = mymatch[I];
            mymatch[I] = k;
            if(t == -1 || dfs(t)) {
                return true;
            }
            mymatch[I] = t;
        }
    }
    return false;
}
int hungary () {
    memset(mymatch, -1, sizeof(mymatch));
    int ans = 0;
    for (int i = 0; i < N; i++) {
        memset(visited, false, sizeof(visited));
        if (dfs(i)) {
            ans++;
        }
    }
    return ans;
}
bool buildgraph() {
    int t, k, a;
    if(scanf("%d", &N) == EOF) {
        return false;
    }
    init();
    memset(temp, -1, sizeof(temp));
    bool flag = false;
    for(int i = 0; i < N; i++) {
        scanf("%d:(%d)", &a, &k);
        if(!flag) {
            if(k > 0) {
                temp[a] = 0;
                flag = true;
            }
        }
        for(int j = 0; j < k; j++) {
            scanf("%d", &t);
            if(temp[a] == 0) {
                temp[t] = 1;
                mymap[a].push_back(t);
            }else{
                temp[t] = 0;
                mymap[t].push_back(a);
            }
        }
    }
    return true;
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
#endif
    while(buildgraph()) {
        printf("%d\n", hungary());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/moonbay/p/2640190.html