poj 2446 poj 2226 二分图 建图

来源:互联网 发布:suse linux yast2 编辑:程序博客网 时间:2024/05/24 06:52

poj 2446 Chessboard

http://poj.org/problem?id=2446

 

把点离散化, 建图

 
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;int m, n, K, map[34][34], a[34*34][34*34] , count ,vis[34*34], match[34*34];int mov[4][2]={-1, 0, 1, 0, 0, 1, 0, -1};void init(){    int x, y, i, j, k;    memset(map, -1, sizeof(map));    memset(a, 0, sizeof(a));    memset(match, -1, sizeof(match));    count=0;    while(K--){        scanf("%d%d", &y, &x);        map[x][y]=0;    }    for(i=1; i<=m; i++){        for(j=1; j<=n; j++){            if(map[i][j])                map[i][j]=++count ;        }    }    for(i=1; i<=m; i++){        for(j=1; j<=n; j++){            if( !map[i][j] )continue;            for(k=0; k<4; k++){                x= i + mov[k][0];                y= j + mov[k][1];                if(x<1 || x>m || y<1 || y>n || map[x][y]==0)                    continue;                a[ map[i][j] ][ map[x][y] ] = 1;            }        }    }}bool find(int p){    int i;    for( i=1; i<=count; i++){        if(a[p][i] && !vis[i]){            vis[i]=1 ;            if(match[i]==-1 || find(match[i])){                match[i]= p;                return true;            }        }    }    return false;}void hungary(){    int i, ans=0;    for( i=1; i<=count; i++){        memset(vis, 0, sizeof(vis));        if(find(i))            ans++ ;    }    if(ans==count) printf("YES\n");    else printf("NO\n");}int main(){  //  freopen("1.txt", "r", stdin);    while(scanf("%d%d%d",&m ,&n ,&K)!=EOF){        init();        hungary();    }    return 0;}

 

poj 2226 Muddy Fields

http://poj.org/problem?id=2226

#include<iostream>#include<cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;char map[55][55];int vis[910], r, c, match[910], a[910][910], rr[55][55], cc[55][55], rm, cm;void init(){    int i,j, count;    for(i=0; i<r; i++){        scanf("%*c%s", &map[i]);        map[i][c]='.';    }    for(j=0; j<=c; j++)        map[r][j]='.';    memset(a, 0, sizeof(a));    memset(match, -1, sizeof(match));    for(i=0, rm=0; i<r; i++){        for(j=0 ; j<c; j++){            if(map[i][j] == '*'){                rr[i][j]=rm;                if(map[i][j+1]=='.')                    rm++;            }        }    }    for(j=0, cm=0; j<c; j++){        for(i=0; i<r; i++){            if(map[i][j]=='*'){                cc[i][j]=cm;                if(map[i+1][j]=='.')                    cm++;            }        }    }    for(i=0; i<r; i++){        for(j=0; j<c; j++){            if(map[i][j]=='*'){                a[rr[i][j]][cc[i][j]]=1;            }        }    }}bool find(int p){    int i;    for(i=0; i<cm; i++){        if(a[p][i]&& !vis[i]){            vis[i]=1;            if(match[i]==-1 || find(match[i])){                match[i]=p;                return true;            }        }    }    return false;}void hungary(){    int ans=0;    for(int i=0; i<rm; i++){        memset(vis, 0, sizeof(vis));            if(find(i))                ans++;    }    printf("%d\n", ans);}int main(){ //   freopen("1.txt", "r", stdin);    while(scanf("%d%d", &r, &c)!=EOF){        init();        hungary();    }    return 0;}


 

原创粉丝点击