较水的网络流。

 /**************************************************************
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() );
}

最新文章

  1. MyBatis处理一行数据-MyBatis使用sum语句报错-MyBatis字段映射-遁地龙卷风
  2. EasyUI-validatebox 自定义validType验证
  3. PC端和手机访问调用不同的页面,JS和PHP不同方法
  4. jQuery multiselect的使用
  5. zoj1492 最大团
  6. My WelcomeApplet
  7. Win7中打开chm文件内容无法显示问题
  8. popen&amp;pclose管道方式操作shell命令
  9. linux终端下为什么用命令打开软件后,要关闭软件才能继续下一条命令?
  10. Windows7部署WordPress傻瓜式教程(IIS7.5+MySQL+PHP+WordPress)
  11. ios Base64编解码工具类及使用
  12. 第三章 视图和URL配置
  13. Spark算子篇 --Spark算子之aggregateByKey详解
  14. Linux/Ubuntu 16.04 使用校园网客户端Dr.com DrClient 有线连网,同时开启WiFi热点
  15. Oracle错误——tablespace &#39;XXXX&#39; does not exist
  16. 使用HttpClient请求,问题记录
  17. [py]super调用父类的方法---面向对象
  18. [Web 前端 ] 五大WEB主流浏览器及四大内核
  19. 爬虫框架之Scrapy——爬取某招聘信息网站
  20. mysql中char,varchar,text

热门文章

  1. React Native DEMO for Android
  2. 阿里Java研发工程师实习面经,附面试技巧
  3. css的背景图片background
  4. Nginx-1.6.3源码安装、虚拟主机
  5. linux -j 4
  6. python爬取网易云音乐歌单音乐
  7. Remove Duplicates from Sorted Array I&amp;&amp;II——怎样防超时
  8. ***关于WP的邮件无法发送问题的总结(原创)
  9. Mysql聚合函数count(*) 的性能分析
  10. [你必须知道的.NET]第十九回:对象创建始末(下)