1. 程式人生 > >POJ 3041 Asteroids HDU 1150 Machine Schedule (最小頂點覆蓋)

POJ 3041 Asteroids HDU 1150 Machine Schedule (最小頂點覆蓋)

連結 : POJ 3041  http://poj.org/problem?id=3041

連結: HDU 1150 http://acm.hdu.edu.cn/showproblem.php?pid=1150

POJ 3041 :

建立二分圖,X集合為行,Y為列,小行星的位置(x,y)就在二分圖裡建一條邊x->y,要求的是在X Y集合裡找到最少的點,使得所有的邊都至少連線一個頂點。

目的就是求最小頂點覆蓋。二分圖裡   最小頂點覆蓋 = 最大匹配

HDU 1150:

模型很明顯就是最小頂點覆蓋,由於0是不需要消耗的 所以不必把0建在圖裡。

poj3041:程式碼:(二分圖匹配模板)

/*--------------------- #headfile--------------------*/
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <cassert>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
/*----------------------#define----------------------*/
#define DRII(X,Y) int (X),(Y);scanf("%d%d",&(X),&(Y))
#define EXP 2.7182818284590452353602874713527
#define CASET int _;cin>>_;while(_--)
#define RII(X, Y) scanf("%d%d",&(X),&(Y))
#define DRI(X) int (X);scanf("%d", &X)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,n) for(int i=0;i<n;i++)
#define ALL(X) (X).begin(),(X).end()
#define INFL 0x3f3f3f3f3f3f3f3fLL
#define RI(X) scanf("%d",&(X))
#define SZ(X) ((int)X.size())
#define PDI pair<double,int>
#define rson o<<1|1,m+1,r
#define PII pair<int,int>
#define MAX 0x3f3f3f3f
#define lson o<<1,l,m
#define MP make_pair
#define PB push_back
#define SE second
#define FI first
typedef long long ll;
template<class T>T MUL(T x,T y,T P){T F1=0;while(y){if(y&1){F1+=x;if(F1<0||F1>=P)F1-=P;}x<<=1;if(x<0||x>=P)x-=P;y>>=1;}return F1;}
template<class T>T POW(T x,T y,T P){T F1=1;x%=P;while(y){if(y&1)F1=MUL(F1,x,P);x=MUL(x,x,P);y>>=1;}return F1;}
template<class T>T gcd(T x,T y){if(y==0)return x;T z;while(z=x%y)x=y,y=z;return y;}
#define DRIII(X,Y,Z) int (X),(Y),(Z);scanf("%d%d%d",&(X),&(Y),&(Z))
#define RIII(X,Y,Z) scanf("%d%d%d",&(X),&(Y),&(Z))
const double pi = acos(-1.0);
const double eps = 1e-8;
const ll mod = 1000000007ll;
const int M = 100005;
const int N = 1005;
using namespace std;

/*----------------------Main-------------------------*/

int X, Y;
int g[N][N];
int mc[N];
bool used[N];

bool dfs(int u) {
    for(int v = 0; v < Y; v++) { // 0 start
        if(g[u][v] && !used[v]) {
            used[v] = 1;
            if(mc[v] == -1 || dfs(mc[v])) {
                mc[v] = u;
                return 1;
            }
        }
    }
    return 0;
}
int Match() {
    int res = 0;
    mem(mc, -1);
    for(int u = 0; u < X; u++) { // 0 start
        mem(used, 0);
        if(dfs(u)) res++;
    }
    return res;
}
int k;
void solve() {
    while(RII(X, k) != EOF) {
        mem(g, 0);
        Y = X;
        while(k--) {
            DRII(x, y);
            x--, y--;
            g[x][y] = 1;
        }
        printf("%d\n", Match());
    }
}

int main() {
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt","w",stdout);
//    CASET
    solve();
    return 0;
}

Hdu 1150
/*--------------------- #headfile--------------------*/
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <cassert>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
/*----------------------#define----------------------*/
#define DRII(X,Y) int (X),(Y);scanf("%d%d",&(X),&(Y))
#define EXP 2.7182818284590452353602874713527
#define CASET int _;cin>>_;while(_--)
#define RII(X, Y) scanf("%d%d",&(X),&(Y))
#define DRI(X) int (X);scanf("%d", &X)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,n) for(int i=0;i<n;i++)
#define ALL(X) (X).begin(),(X).end()
#define INFL 0x3f3f3f3f3f3f3f3fLL
#define RI(X) scanf("%d",&(X))
#define SZ(X) ((int)X.size())
#define PDI pair<double,int>
#define rson o<<1|1,m+1,r
#define PII pair<int,int>
#define MAX 0x3f3f3f3f
#define lson o<<1,l,m
#define MP make_pair
#define PB push_back
#define SE second
#define FI first
typedef long long ll;
template<class T>T MUL(T x,T y,T P){T F1=0;while(y){if(y&1){F1+=x;if(F1<0||F1>=P)F1-=P;}x<<=1;if(x<0||x>=P)x-=P;y>>=1;}return F1;}
template<class T>T POW(T x,T y,T P){T F1=1;x%=P;while(y){if(y&1)F1=MUL(F1,x,P);x=MUL(x,x,P);y>>=1;}return F1;}
template<class T>T gcd(T x,T y){if(y==0)return x;T z;while(z=x%y)x=y,y=z;return y;}
#define DRIII(X,Y,Z) int (X),(Y),(Z);scanf("%d%d%d",&(X),&(Y),&(Z))
#define RIII(X,Y,Z) scanf("%d%d%d",&(X),&(Y),&(Z))
const double pi = acos(-1.0);
const double eps = 1e-8;
const ll mod = 1000000007ll;
const int M = 100005;
const int N = 1005;
using namespace std;

/*----------------------Main-------------------------*/

int X, Y;
int g[N][N];
int mc[N];
bool used[N];

bool dfs(int u) {
    for(int v = 0; v < Y; v++) { // 0 start
        if(g[u][v] && !used[v]) {
            used[v] = 1;
            if(mc[v] == -1 || dfs(mc[v])) {
                mc[v] = u;
                return 1;
            }
        }
    }
    return 0;
}
int Match() {
    int res = 0;
    mem(mc, -1);
    for(int u = 0; u < X; u++) {
        mem(used, 0);
        if(dfs(u)) res++;
    }
    return res;
}
int k;
void solve() {
    while(RI(X) && X > 0) {
        RII(Y, k);
        mem(g, 0);
        while(k--) {
            DRIII(id, x, y);
            if(x > 0 && y > 0) g[x][y] = 1;
        }
        printf("%d\n", Match());
    }
}

int main() {
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt","w",stdout);
//    CASET
    solve();
    return 0;
}