码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1281

时间:2015-08-25 16:54:21      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

链接:点击打开链接

题意:N*M的棋盘,接下来的K行描述了所有格子的信息:每行两个数X和Y,表示了这个格子在棋盘中的位置.问重点格子的个数和不同行不同列的棋子个数(如果拿掉一个格子的棋子之后不同行不同列的个数改变则这个格子叫重点格子)

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,k;
int s[105][105],match[105],vis[105],xx[105],yy[105];
int dfs(int x){
    int i,j;
    for(i=1;i<=m;i++){
        if(!vis[i]&&s[x][i]){
        vis[i]=1;
        if(!match[i]||dfs(match[i])){
        match[i]=x;
        return 1;
        }
        }
    }
    return 0;
}
int hungarian(){
    int i,sum;
    sum=0;
    for(i=1;i<=n;i++){
        memset(vis,0,sizeof(vis));
        if(dfs(i))
        sum++;
    }
    return sum;
}                                //匈牙利算法
int main(){
    int i,j,cur,ans,sum,temp;
    cur=1;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF){
        memset(s,0,sizeof(s));
        memset(match,0,sizeof(match));
        for(i=1;i<=k;i++){
        scanf("%d%d",&xx[i],&yy[i]);
        s[xx[i]][yy[i]]=1;
        }
        ans=hungarian();         //不同行不同列的个数
        sum=0;
        for(i=1;i<=k;i++){
            s[xx[i]][yy[i]]=0;  //遍历所有可放棋子的格子
            memset(match,0,sizeof(match));
            temp=hungarian();   //不要忘记初始化match数组
            if(temp!=ans)
            sum++;
            s[xx[i]][yy[i]]=1;
        }
        printf("Board %d have %d important blanks for %d chessmen.\n",cur++,sum,ans);
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu1281

标签:

原文地址:http://blog.csdn.net/stay_accept/article/details/47975977

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