codeforce Gym 100203I I WIN (网络流)
把'I'拆成容量为1一条边,一个入点一个出点,入点和相邻的'W'连一条容量为1的边,出点和相邻的'N'连一条容量为1,所有的'W'和源点连一条容量为1边,所有的'N'和汇点连一条容量为1的边,表示只能用一次。一发网络流就过了。
写了4000B+的贪心,然并卵
#include<bits/stdc++.h>
using namespace std; const int INF = 0x3fffffff;
const int maxn = ;
#define PB push_back
struct Edge
{
int from,to,cap,flow;
}; vector<Edge> edges;
vector<int> G[maxn];
int S ,T ; void AddEdge(int from,int to,int cap)
{
edges.PB(Edge{from,to,cap,});
edges.PB(Edge{to,from,,});
int m = edges.size();
G[from].PB(m-);
G[to].PB(m-);
} bool vis[maxn];
int d[maxn],cur[maxn]; bool bfs()
{
memset(vis,,sizeof(vis));
queue<int> q;
q.push(S);
d[S] = ;
vis[S] = true;
while(q.size()){
int u = q.front(); q.pop();
for(int i = ; i < G[u].size(); i++){
Edge &e = edges[G[u][i]];
if(!vis[e.to] && e.cap > e.flow){
vis[e.to] = true;
d[e.to] = d[u] + ;
q.push(e.to);
}
}
}
return vis[T];
} int dfs(int u,int a)
{
if(u == T || a == ) return a;
int flow = , f;
for(int &i = cur[u]; i < G[u].size(); i++){
Edge &e = edges[G[u][i]];
if(d[u] + == d[e.to] && (f = dfs(e.to,min(a,e.cap-e.flow))) >){
e.flow += f;
edges[G[u][i]^].flow -= f;
flow += f;
a -= f;
if(a == ) break;
}
}
return flow;
} int MaxFlow()
{
int flow = ;
while(bfs()){
memset(cur,,sizeof(cur));
flow += dfs(S,INF);
}
return flow;
} typedef pair<int,int> pii;
#define fi first
#define se second
#define MP make_pair
vector<pii> vec; const int N = ;
char s[N][N];
int id[N][N]; int dx[] = {,,-,};
int dy[] = {,-,,}; int main()
{
//freopen("in.txt","r",stdin);
int n,m; scanf("%d%d",&n,&m);
int Icnt = , Wcnt = , Ncnt = ;
for(int i = ; i <= n; i++){
scanf("%s",s[i]+);
for(int j = ; j <= m; j++){
if(s[i][j] == 'I'){
vec.PB(MP(i,j));
id[i][j] = Icnt++;
}
if(s[i][j] == 'W'){
id[i][j] = Wcnt++;
}
if(s[i][j] == 'N'){
id[i][j] = Ncnt++;
}
}
}
int MW = Icnt* + ;
int MN = MW + Wcnt + ;
S = MN +Ncnt + ; T = MN +Ncnt + ;
for(int i = ; i < vec.size(); i++){
int x = vec[i].fi, y = vec[i].se;
int in = *i+, out = *i+;
AddEdge(in,out,);
for(int k = ; k < ; k++){
int nx = x+dx[k], ny = y+dy[k];
if(s[nx][ny] == 'W'){
int u = id[nx][ny]+MW;
AddEdge(u,in,);
}
if(s[nx][ny] == 'N'){
int v = id[nx][ny]+MN;
AddEdge(out,v,);
}
}
}
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++){
if(s[i][j] == 'W'){
int v = id[i][j]+MW;
AddEdge(S,v,);
}
if(s[i][j] == 'N'){
int u = id[i][j]+MN;
AddEdge(u,T,);
}
}
int ans = MaxFlow();
printf("%d",ans);
return ;
}
codeforce Gym 100203I I WIN (网络流)的更多相关文章
- Gym - 100203I I WIN 网络流
Gym - 100203I I WIN 题意:一个n*m的矩阵包含W,I,N三种字符,问相邻的字符最多能组成不重叠的WIN. 思路:比赛的时候没有发现是网络流,,居然一度以为是二分图匹配,,写了一下 ...
- Codeforces Gym 100203I I WIN 最大流
原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 首先寻找每个I,然后枚举形状,如果匹 ...
- Codeforces Gym 100203I I - I WIN 网络流最大流
I - I WINTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.acti ...
- Codeforce Gym 100015I Identity Checker 暴力
Identity Checker 题目连接: http://codeforces.com/gym/100015/attachments Description You likely have seen ...
- codeforce gym/100495/problem/K—Wolf and sheep 两圆求相交面积 与 gym/100495/problem/E—Simple sequence思路简述
之前几乎没写过什么这种几何的计算题.在众多大佬的博客下终于记起来了当时的公式.嘚赶快补计算几何和概率论的坑了... 这题的要求,在对两圆相交的板子略做修改后,很容易实现.这里直接给出代码.重点的部分有 ...
- codeforce Gym 101102A Coins (01背包变形)
01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...
- codeforce gym/100495/problem/F Snake++——DFS应用
emmmm.... 在被新生暴打后,我花了很久才补出这道DFS.由于WA1检查了半天,最后竟然是输出少了一个: ,心态小崩. 这里普通的dfs算出的连通区域并不能直接当做最后的答案.所以需要类似模 ...
- codeforce Gym 100425E The Street Escalator(期望,线性递推)
算数学期望,每个人都可以分开来考虑.Xi表示第i个人跑到另外一边的次数. Xi服从二项分布.概率的和是个二项式,(p+1-p)^T,把二项式展开,p的偶次项是留在原来那一边的概率. 可以用((a+b) ...
- Gym - 101128F Landscaping(网络流)
题意 给你一个\(N×M\)的草地,有高地有低地. 收割机从低地走到高地或者从高地走到低地都要花费用\(A\),你可以花费用\(B\)把一块高地变成低地,或者把一块低地变成高地.收割机每行每列都是必须 ...
随机推荐
- Ubuntu安装vnc+gnome的xstartup配置
Log 1 安装vncserver并且在xstartup配置gnome 背景:学习Ruby,想在ubuntu下使用rubymine 时间:2014-3-10 环境:Ubuntu 记录:Roy 其实这个 ...
- CodeForces Gym 100685J Just Another Disney Problem (STL,排序)
题意:给定你大小未知的n个数,你允许有不超过一万次的询问,每次询问两个数,第i个数是否比第j个数小?然后后台会返回给你一个结果YES或者NO(即一行输入), 然后经过多次询问后,你需要给出一个正确的原 ...
- CSS3 制作魔方 - 形成魔方
道路千万条,安全第一条! 魔方结构解析 从魔方的外观来看,可以有多种方式来表达它的组成,从而也有多种方式来形成一个魔方.如: 由六个面组成 由若干层组成 由多个方块组成 无论哪种方式,都可以制作魔方. ...
- Unity3D游戏开发之Unity与Android交互调用研究
各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在前一篇文章中,我们研究了Android平台上Unity3D的手势操作并在之前的基础 ...
- [Xcode 实际操作]八、网络与多线程-(22)使用GCD多线程技术异步下载图片
目录:[Swift]Xcode实际操作 本文将演示如何使用使用GCD多线程技术异步下载图片. Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法 ...
- [Xcode 实际操作]九、实用进阶-(16)给图片添加水印效果
目录:[Swift]Xcode实际操作 本文将演示如何截取屏幕画面,并将截取图片,存入系统相册. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New File]创建一个扩展文件-> ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4. 设备上报属性
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- Mybatis分页中遇到的坑2
站在巨人的肩膀上 http://crocutax.com/blog/mybatis-one-to-many-nestes-query-and-page-query Mybatis一对多嵌套查询和 ...
- MyBatist庖丁解牛(一)
站在巨人的肩膀上,感谢! https://www.jianshu.com/p/ec40a82cae28?utm_campaign=maleskine&utm_content=note& ...
- UVA297:Quadtrees(四分树)
题目描述 四象树是每个内结点均有4个子结点的特殊四叉树,它可用于描述平面上黑白图像.平面上的黑白图像是32行×32列的正方形,每个格子称为1个象素,是最小的图像单位.正方形图像可分成四个相等的小正方形 ...