bzoj 1779
较水的网络流。
/**************************************************************
Problem: 1779
User: idy002
Language: C++
Result: Accepted
Time:36 ms
Memory:1520 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define maxn 4010
#define fprintf(...)
#define oo 0x3f3f3f3f
using namespace std; struct Edge {
int u, v, f;
Edge( int u, int v, int f ):u(u),v(v),f(f){}
};
struct Dinic {
int src, dst;
vector<Edge> edge;
vector<int> g[maxn];
int dep[maxn], cur[maxn]; void init( int src, int dst ) {
this->src = src;
this->dst = dst;
}
void adde( int u, int v, int f ) {
fprintf( stderr, "%d->%d %d\n", u, v, f );
g[u].push_back( edge.size() );
edge.push_back( Edge(u,v,f) );
g[v].push_back( edge.size() );
edge.push_back( Edge(v,u,) );
}
bool bfs() {
queue<int> qu;
memset( dep, , sizeof(dep) );
qu.push( src );
dep[src] = ;
while( !qu.empty() ) {
int u=qu.front();
qu.pop();
for( int t=; t<g[u].size(); t++ ) {
Edge &e = edge[g[u][t]];
if( e.f && !dep[e.v] ) {
dep[e.v] = dep[e.u]+;
qu.push( e.v );
}
}
}
return dep[dst];
}
int dfs( int u, int a ) {
if( u==dst || a== ) return a;
int remain=a, past=, na;
for( int &t=cur[u]; t<g[u].size(); t++ ) {
Edge &e = edge[g[u][t]];
Edge &ve = edge[g[u][t]^];
if( dep[e.v]==dep[e.u]+ && e.f && (na=dfs(e.v,min(e.f,remain))) ) {
remain -= na;
past += na;
e.f -= na;
ve.f += na;
if( remain== ) break;
}
}
return past;
}
int maxflow() {
int flow=;
while( bfs() ) {
memset( cur, , sizeof(cur) );
flow += dfs(src,oo);
}
return flow;
}
}D; int n, m;
vector<int> g[maxn];
int cnt[maxn];
char stat[maxn];
int idj[maxn], idt[maxn], ide[maxn][]; void makeid( int &src, int &dst ) {
int id_clock = ;
src = ++id_clock;
dst = ++id_clock;
fprintf( stderr, "src=%d dst=%d\n", src, dst );
for( int i=; i<=n; i++ ) {
if( stat[i]=='J' ) {
idj[i] = ++id_clock;
fprintf( stderr, "idj[%d] = %d\n", i, idj[i] );
} else if( stat[i]=='T' ) {
idt[i] = ++id_clock;
fprintf( stderr, "idt[%d] = %d\n", i, idt[i] );
}
if( stat[i]!='T' ) {
ide[i][] = ++id_clock;
ide[i][] = ++id_clock;
fprintf( stderr, "ide[%d][0] = %d\n", i, ide[i][] );
fprintf( stderr, "ide[%d][1] = %d\n", i, ide[i][] );
}
}
}
int main() {
scanf( "%d%d", &n, &m );
scanf( "%s", stat+ );
for( int i=; i<=n; i++ )
cnt[i] = cnt[i-]+(stat[i]=='E');
for( int i=,u,v; i<=m; i++ ) {
scanf( "%d%d", &u, &v );
g[u].push_back(v);
g[v].push_back(u);
}
int src, dst;
makeid( src, dst );
D.init( src, dst );
for( int i=; i<=n; i++ ) {
if( stat[i]=='J' ) {
D.adde( src, idj[i], );
D.adde( idj[i], ide[i][], );
for( int t=; t<g[i].size(); t++ ) {
int j=g[i][t];
if( stat[j]=='T' ) continue;
D.adde( idj[i], ide[j][], );
}
} else if( stat[i]=='T' ) {
D.adde( idt[i], dst, );
for( int t=; t<g[i].size(); t++ ) {
int j=g[i][t];
if( stat[j]=='T' ) continue;
D.adde( ide[j][], idt[i], );
}
}
if( stat[i]!='T' ) {
D.adde( ide[i][], ide[i][], );
}
}
printf( "%d\n", D.maxflow() );
}
bzoj 1779的更多相关文章
- BZOJ 1779. [Usaco2010 Hol]Cowwar 奶牛战争
传送门 考虑构建网络流模型 把一个流量看成一只奶牛的攻击过程,那么答案就是最大流 因为每只奶牛只能操作一波,所以构造分层图,一层相当于一步 第一层就是初始状态,从 $S$ 向所有 $J$ 奶牛连一条流 ...
- bzoj usaco 金组水题题解(2)
续.....TAT这回不到50题编辑器就崩了.. 这里塞40道吧= = bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 比较经典的最小割?..然而 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- HOJ 1108
题目链接:HOJ-1108 题意为给定N和M,找出最小的K,使得K个N组成的数能被M整除.比如对于n=2,m=11,则k=2. 思路是抽屉原理,K个N组成的数modM的值最多只有M个. 具体看代码: ...
- 关于Hazard Pointers的话题
关于Hazard Pointers的话题, 起源于这个文章: 实现无锁的栈与队列(4) http://www.cnblogs.com/catch/p/3176636.html 其实他的系列文章(3)之 ...
- python实现链式调用
在python中实现链式调用只需在函数返回对象自己就行了. class Person: def name(self, name): self.name = name return self def a ...
- ansible报错Aborting, target uses selinux but python bindings (libselinux-python) aren't installed
报错内容: TASK [activemq : jvm configuration] ********************************************************** ...
- IP负载均衡技术
参考链接:http://www.360doc.com/content/12/1117/19/820209_248442094.shtml
- GitBash、EGit、SourceTree三个Git管理工具对比
Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...
- webservice使用
soap方法 一:PHP本身的SOAP 所有的webservice都包括服务端(server)和客户端(client). 要使用php本身的soap首先要把该拓展安装好并且启用.下面看具体的code ...
- Linux软件安装install命令
install 1.作用 install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户. 2.格式 (1)install [选项]... 来源 目的地 (2)install [选项]. ...
- js完成密码输入为空,和两次输入不一致
<!DOCTYPE html><html><body> <script language="javascript"> functio ...
- Quartz任务调度入门
Quartz任务调度入门 了解Quartz体系结构Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念 ...