【HDU】 1281 棋盘游戏
2016-05-17 19:14
302 查看
棋盘游戏
题目链接
棋盘游戏题目大意
现在给你一个棋盘,只有部分格子可以放棋子——车。相同行列上的车会相互攻击。在这个棋盘上现在放棋子,我们想放的最多,同时我们定义一种格子叫“重要点“。就是说只要这个格子不放棋子,我们就不能放置最多的棋子(讲的有点绕,总之看题目数据就懂了)。题解
首先我们想放的最多,我们可以用2分图解决,(x,y)上若可以放置棋子,我们就从x向y建立一条边,最后跑一遍匈牙利就行了。至于这个点是不是重要点,枚举即可…代码
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int n,m,k,x[10005],y[10005],g[105][105],link[105]; bool vis[105],flag[105]; bool dfs(int u) { for (int i=1;i<=k;i++) { int v=y[i]; if (!vis[v] && g[u][v]) { vis[v]=1; if (!link[v] || dfs(link[v])) { link[v]=u; return 1; } } } return 0; } int main() { int Case=1; while (scanf("%d%d%d",&n,&m,&k)!=EOF) { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(g,0,sizeof(g)); memset(link,0,sizeof(link)); memset(flag,0,sizeof(flag)); for (int i=1;i<=k;i++) { scanf("%d%d",&x[i],&y[i]); g[x[i]][y[i]]=1; } int ans=0,cnt=0; for (int i=1;i<=k;i++) { int u=x[i]; memset(vis,0,sizeof(vis)); if (!flag[u] && dfs(u)) ans++; flag[u]=1; } for (int i=1;i<=k;i++) { memset(flag,0,sizeof(flag)); memset(link,0,sizeof(link)); int u=x[i],v=y[i]; g[u][v]=0; //solve int num=0; for (int j=1;j<=k;j++) { memset(vis,0,sizeof(vis)); if (!flag[x[j]] && dfs(x[j])) num++; flag[x[j]]=1; } g[u][v]=1; if (num<ans) cnt++; } printf("Board %d have %d important blanks for %d chessmen.\n",Case++,cnt,ans); } return 0; }
相关文章推荐
- centos7的变化
- 【GDOI 2016 Day1】第四题 疯狂动物城
- 手工玫瑰花折纸
- 微信公众号第三方平台开发PYTHON教程 PART 1
- IOS学习之初识KVC
- OC NSFileManager(文件路径操作)
- Ionic ngcordova 二维码扫描
- Ionic ngcordova 二维码扫描
- the summary of dp
- Python项目之即时标记
- kettle-error-OPTION SQL_SELECT_LIMIT=DEFAULT
- 利用python3的urllib.request抓取网页内容并显示中文
- 【BZOJ2754】【codevs2403】喵星球上的点名,AC自动机与STL的狂欢
- QT widget设置QT::FramelessWindowHint和Qt::WA_TranslucentBackground,会出现一个bug:在最小化还原时界面停止刷新
- 友盟分享中添加自定义的分享按钮
- mybatis学习笔记——java.lang.NullPointerException
- IIS报错 试图加载格式不正确 的程序集解决办法
- Power Gating的设计(架构)
- TpLink随身wifi之linux驱动安装
- Okhttp session持久化