POJ 3041 Asteroids HDU 1150 Machine Schedule (最小頂點覆蓋)
阿新 • • 發佈:2019-01-31
連結 : 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; }