bzoj2718
二分图匹配
首先有个定理:最长反链=最小链覆盖
最小链覆盖可以重复经过点
所以我们不能直接建图
那么我们用floyd判断是否相连
然后建图就行了
#include<bits/stdc++.h>
using namespace std;
const int N = , inf = 1e9;
int rd()
{
int x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
int n, m, k, D, source, sink, cnt = , tot;
int a[N], d[N], head[N], iter[N], Map[N][N];
struct edge {
int nxt, to, f;
} e[N * N];
bool bfs()
{
queue<int> q;
memset(d, -, sizeof(d));
d[source] = ;
q.push(source);
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = head[u]; i; i = e[i].nxt) if(d[e[i].to] == - && e[i].f)
{
d[e[i].to] = d[u] + ;
q.push(e[i].to);
}
}
return d[sink] != -;
}
int dfs(int u, int delta)
{
if(u == sink) return delta;
int ret = ;
for(int &i = iter[u]; i && delta; i = e[i].nxt) if(d[e[i].to] == d[u] + && e[i].f)
{
int x = dfs(e[i].to, min(delta, e[i].f));
ret += x;
delta -= x;
e[i].f -= x;
e[i ^ ].f += x;
}
return ret;
}
int dinic()
{
int ret = ;
while(bfs())
{
for(int i = source; i <= sink; ++i) iter[i] = head[i];
ret += dfs(source, inf);
}
return ret;
}
void link(int u, int v, int f)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].f = f;
}
void insert(int u, int v, int f)
{
link(u, v, f);
link(v, u, );
}
int main()
{
scanf("%d%d", &n, &m);
sink = * n + ;
for(int i = ; i <= m; ++i)
{
int u, v;
scanf("%d%d", &u, &v);
Map[u][v] = ;
}
for(int k = ; k <= n; ++k)
{
insert(source, k, );
insert(k + n, sink, );
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
Map[i][j] |= (Map[i][k] & Map[k][j]);
}
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j) if(Map[i][j])
insert(i, j + n, );
printf("%d\n", n - dinic());
return ;
}
bzoj2718的更多相关文章
- BZOJ-1143&&BZOJ-2718 祭祀river&&毕业旅行 最长反链(Floyed传递闭包+二分图匹配)
蛋蛋安利的双倍经验题 1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1901 Solved: 951 ...
- BZOJ2718: [Violet 4]毕业旅行
2718: [Violet 4]毕业旅行 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 229 Solved: 126[Submit][Status ...
- [转载]hzwer的bzoj题单
counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ120 ...
- BZOJ刷题列表【转载于hzwer】
沿着黄学长的步伐~~ 红色为已刷,黑色为未刷,看我多久能搞完吧... Update on 7.26 :之前咕了好久...(足见博主的flag是多么emmm......)这几天开始会抽时间刷的,每天几道 ...
随机推荐
- 1.excel如何让一列的数都乘以固定值
让B列等于A列乘以39.37 1.我们先选中B列中要编辑的单元: 2.再在编辑栏中输入公式:=A2*39.37 (PS:*号即表示是×号) 3.公式输入后,按下快捷键:CTRL+回车:记住一定要 ...
- java模拟而一个电话本操作
哈哈.大家平时都在使用电话本.以下使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po; /** * * 电话人的信息 * */ public ...
- memcache及其telnet命令使用详解
1.启动Memcache 常用参数memcached 1.4.3-p <num> 设置端口号(默认不设置为: 11211)-U <num> UDP监听端口 ...
- iOS用户是否打开APP通知开关跳转到系统的设置界面
1.检测用户是否打开推送通知 /** 系统通知是否打开 @return 是否打开 */ //检测通知是否打开iOS8以后有所变化 所以需要适配iOS7 + (BOOL)openThePushNoti ...
- 简化Android的startActivityForResult调用
一个是解决在onActivityResult 中判断requestCode的问题,第二个是让调用代码的地方就知道我是如何处理对方activity 的返回的. 首先我们有一个ResultActivity ...
- slidemenu
1. 在github上有一个效果不错的开源库,SlidingMenu 最新的代码下载下来后,会报错: No resource found that matches the given name: at ...
- SPOJ - LCS 后缀自动机入门
LCS - Longest Common Substring A string is finite sequence of characters over a non-empty finite set ...
- 九度OJ 1111:单词替换 (查找)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4473 解决:1268 题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔 ...
- 怎样把word直接转换成ppt
- Struts action
<action name="KnowledgeBankManageAction_*" class="knowledgeBankManageAction" ...