码迷,mamicode.com
首页 > 编程语言 > 详细

ZOJ 3646 (匹配匈牙利..算法)

时间:2015-05-30 10:46:45      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:


题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3646


题目抽象出来就是每一行有若干个数,问是否存在一个解法从每一行中选择一个数,使得1~n这n个数都被选到,队友说这就是一个裸的匹配啊,然后就过了。


code:


#include <cstdio>
#include <iostream>
#include <cstring>
#include <cctype>
#define clr(x,y) memset(x, y, sizeof x)
#include <cmath>
using namespace std;
const int maxn=6e2+6;
const int maxm=maxn*maxn*2;
int first[maxn];
struct edge{
    int nxt,t,f;
}e[maxm];

void addedge(int f,int t,int ind){
    e[ind].nxt=first[f];
    e[ind].t=t;
    e[ind].f=f;
    first[f]=ind;
}
int n;
char maz[maxn][maxn];

bool vis[maxn];
int match[maxn];
bool dfs(int f){
    vis[f]=true;
    for(int p=first[f];p!=-1;p=e[p].nxt){
        int t=e[p].t;
        int mch=match[t];
        if(mch==-1||(!vis[mch]&&dfs(mch))){
            match[t]=f;
            match[f]=t;
            return true;
        }
    }
   // printf("dfs %d no\n",f);
    return false;
}
int findmatch(){
    int ans=0;
    for(int i=0;i<n;i++){
        if(match[i]==-1){
            clr(vis,0);
            if(dfs(i))ans++;
        }
    }
    return ans;
}
void init(){
    clr(first,-1);
    clr(match,-1);
}
int main(){
    //freopen("input.txt","r",stdin);
    while(scanf("%d",&n)==1){
        init();
        int en=0;
        for(int i=0;i<n;i++)scanf("%s",maz[i]);
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(maz[i][j]=='U'){
                    addedge(i,j+n,en++);
                    addedge(j+n,i,en++);
                }
            }
        }
        int ans=findmatch();
        if(ans==n){
            puts("YES");
        }
        else {
            puts("NO");
        }
    }
    return 0;
}

ZOJ 3646 (匹配匈牙利..算法)

标签:

原文地址:http://blog.csdn.net/u013649253/article/details/46271785

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!