[NOIP2010]关押罪犯(二分+二分图染色)
来源:互联网 发布:淘宝卖家温馨寄语 编辑:程序博客网 时间:2024/05/18 16:13
传送门
大意:我们把图分为两部分,使得两部分中的内部边的最大权值最小。
思路:哎,拿到题的时候想了二分图染色,发现不好做,但我没有想到二分,只好最后去骗了一个30分。正确的思路是:首先我们要 去二分最大的冲突边的是哪一条(按照权值二分),因为当二分的边权增大时,连的边也就越少,连通块的数目就越多,冲突就越少,所以边权是可以二分的,在二分过后用二分图判定,如果可以染成二分图即为可行的解。
代码:
#include<cstdio>#include<algorithm>#include<cstring>#define MAXM 100005#define MAXN 20005using namespace std;int col[MAXN], n, m;struct node{ int v, w; node *next;}Edge[MAXM * 2], *Adj[MAXN], *Mcnt = Edge;struct E{ int u, v, w; bool operator < (const E rhs) const { return w < rhs.w; }}e[MAXM];void Addedge(int u, int v, int w){ node *t = ++Mcnt; t->v = v; t->w = w; t->next = Adj[u]; Adj[u] = t;}int ans, mid;bool dfs(int u, int fa){ if(col[u] != -1 && col[u] == col[fa]) return 0; if(col[u] == !col[fa]) return 1; col[u] = !col[fa]; for(node *p = Adj[u]; p; p = p->next) if(p->v != fa) if(p->w > e[mid].w) if(!dfs(p->v, u)) return 0; return 1;}int main(){ scanf("%d%d", &n, &m); int l = 0, r = m; for(int i = 1; i <= m; i ++) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w); sort(e + 1, e + m + 1); for(int i = 1; i <= m; i ++) { Addedge(e[i].u, e[i].v, e[i].w); Addedge(e[i].v, e[i].u, e[i].w); } while(l <= r) { mid = (l + r) >> 1; memset(col, -1, sizeof(int) * (n+2)); col[0] = 0; bool flag = 0; for(int i = 1; i <= n; i ++) if(col[i] == -1) if(!dfs(i, 0)) { flag = 1; break; } if(flag) l = mid + 1; else {ans = e[mid].w; r = mid - 1;} } printf("%d\n", ans); return 0;}
0 0
- [NOIP2010]关押罪犯(二分+二分图染色)
- NOIP2010 关押罪犯 (二分答案+二分图染色)
- codevs 1069 [NOIP2010] 关押罪犯 二分+二分图染色
- 【二分+染色】【NOIP2010】关押罪犯 prison
- 【图-二分图染色】NOIP2010提高组关押罪犯
- NOIP2010 关押罪犯(图论+二分)
- [codevs1069]关押罪犯 二分图染色
- 【NOIP2010】关押罪犯 (二分+图染色)||(贪心+并查集)
- noip2010 关押罪犯 二分答案+二分图判断
- 关押罪犯-详解-noip2010-并查集--搜索--二分图
- 【noip2010】codevs 1069 关押罪犯(二分+BFS染色||并查集)
- [NOIP2010][并查集][二分答案]关押罪犯
- NOIP 2010 关押罪犯 二分答案+二分图染色判定 COGS 520
- NOIP 2010 关押罪犯 并查集 二分+二分图染色
- noip2010 关押罪犯 (并查集处理二分图分配)
- NOIP2010 Codevs 1069 关押罪犯 [并查集] [二分图判定]
- 【二分】关押罪犯
- 【洛谷 1525】关押罪犯 并查集||二分+染色
- IOS开发类似于微博个人中心的头像可以拖动lei
- textfield的属性
- VB使用ADODB操作数据库
- IOS开发笔记-01按钮操作-01入学须知
- android Parcelable 带有数组的对象如何序列化 String[] Long[] int[] Object[]
- [NOIP2010]关押罪犯(二分+二分图染色)
- android模拟器重启防止恢复重置,永久删除系统应用apk
- nyoj 6 喷水装置(一)
- CLRS 5.2指示器随机变量
- eclipse和pydev的配置
- Android 动态解析布局,实现制作多套主题
- 华为OJ平台试题 —— 数组:输入n个整数,输出其中最小的k个
- Legal or Not
- HDOJ-1251 字典树