CF411H 被遗忘的树 Havel定理 || 网络流
全场只有3个人A的题扔过来当今天的T4.Orz DWX大爷考试时A掉这道题
网络流做法是题解做法,上CF就能看到
但是我们还有其他的方法!
我们有Havel定理的某条推论,既然这是一个树,那么某个子联通块中的点数一定大于边数
然后我们就贪心地选择,用上面的东西来判断是否可选
然后没了
结果考试的时候直接对于10的部分分输出一条链就不会了
Orz 龙哥 rand出60分
结果SDOI3道题和这道神题扔过来4个小时一起做的感觉真是爽
/* ***********************************************
Author :BPM136
Created Time :2016/4/25 17:00:52
File Name :DSF.cpp
************************************************ */#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<bitset>
#include<queue>
#include<ctime>
#include<set>
#include<map>
#include<utility>
#include<vector>
#include<functional>
#include<numeric>
#include<memory>
#include<iterator>
#define LL long long
#define DB double
#define LB long double
#define UL unsigned long
#define ULL unsigned long long
#define pb push_back
#define popb pop_back
#define get(a,i) a&(1<<(i-1))
#define PAU putchar(32)
#define ENT putchar(10)
#define clr(a,b) memset(a,b,sizeof(a))
#define fo(_i,_a,_b) for(int _i=_a;_i<=_b;_i++)
#define fd(_i,_a,_b) for(int _i=_a;_i>=_b;_i--)
#define efo(_i,_a) for(int _i=last[_a];_i!=0;_i=e[_i].next)
#define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
#define filein(x) freopen(#x".in","r",stdin)
#define fileout(x) freopen(#x".out","w",stdout)
#define mkd(x) freopen(#x".in","w",stdout);
#define setlargestack(x) int size=x<<20;char *p=(char*)malloc(size)+size;__asm__("movl %0, %%esp\n" :: "r"(p));
#define end system("pause")
using namespace std;
LL read()
{LL f=1,d=0;char s=getchar();while (s<48||s>57){if (s==45) f=-1;s=getchar();}while (s>=48&&s<=57){d=d*10+s-48;s=getchar();}return f*d;
}
LL readln()
{LL f=1,d=0;char s=getchar();while (s<48||s>57){if (s==45) f=-1;s=getchar();}while (s>=48&&s<=57){d=d*10+s-48;s=getchar();}while (s!=10) s=getchar();return f*d;
}
inline void write(LL x)
{if(x==0){putchar(48);return;}if(x<0)putchar(45),x=-x;int len=0,buf[20];while(x)buf[len++]=x%10,x/=10;for(int i=len-1;i>=0;i--)putchar(buf[i]+48);return;
}
inline void writeln(LL x){write(x);ENT;}const int N = 200010;
const int M = 7;
const int MAX = 45;int cnt[M];
int f[N][M];//vector<int> all[MAX];
int all[MAX][N];
int tail[MAX];
int a[MAX][MAX], sz[MAX];
int n, m = -1;int tank[M][M][N];
int Ans[N][2];int GetNxt() {char s = getchar(); int d = 1;while(s != '?') s = getchar();while(s == '?') {s = getchar();if(s == '?') d ++;}return d;
}void init() {
// fo(i, 0, MAX-1) all[i].clear();fo(i, 0, MAX - 1) tail[i] = 0;n = read();
// scanf("%d",&n);fo(i, 1, n) {int len = 0, tmp = i;while(tmp > 0) {len ++, tmp /= 10;}len --;all[len][ tail[len]++ ] = i;if(len + 1 > m) m = len + 1;
// m = max(m, len + 1);}fo(i, 0, m - 1) sz[i] = tail[i];
#define DEBUG2 looksize
// fo(i, 0, m - 1) cout<< sz[i] << ' ';cout<<endl;
// memset(a,0,sizeof(a));
// char s1[MAX], s2[MAX];fo(i, 0, n - 2) {int x = GetNxt(); x --;int y = GetNxt(); y --;tank[x][y][ ++ tank[x][y][0] ] = i;a[x][y] ++;
#define DEBUG3 looka
// cout<<x<<' '<<y<<endl;}//cout<<endl;
}int tmp[MAX], nu;
int v, e;
bool check() {fo(j, 1, (1 << m) - 1) {nu = 0;fo(i, 0, m - 1)if(j & (1 << i)) {tmp[nu ++] = i;}v = 0, e = 0;fo(i, 0, nu - 1) v += sz[tmp[i]];fo(i, 0, nu - 1) fo(j, 0, nu - 1) {e += a[tmp[i]][tmp[j]];}
#define DEBUG1 lookhell with the edge and ver// cout<< e << ' ' << v <<endl;if(e >= v) return 0;}return 1;
}void PushAns(int bit1, int bit2, int u, int v) {if(tank[bit1][bit2][0] == 0) swap(bit1, bit2);int G = tank[bit1][bit2][ tank[bit1][bit2][0] -- ];Ans[G][0] = u, Ans[G][1] = v;
}void work() {if(check() == 0) {puts("-1");return ;}
#define DEBUG4 breakpoint
// cerr<<"startwork"<<endl;for(;1;) {int flag = 0;fo(i, 0, m - 1) {fo(j, 0, m - 1) {if(a[i][j] == 0) continue;if(sz[i] > 1) {a[i][j] --, sz[i] --;if(check()) {
#define DEBUG5 lookedge1
// write(all[i].back()); PAU; writeln(all[j][0]);PushAns(i, j, all[i][ tail[i]-1 ], all[j][0]);tail[i] --, flag = 1;break;}sz[i] ++, a[i][j] ++;}if(sz[j] > 1) {a[i][j] --, sz[j] --;if(check()) {
#define DEBUG6 lookedge2
// write(all[i][0]); PAU; writeln(all[j].back());PushAns(i, j, all[i][0], all[j][ tail[j]-1 ]);tail[j] --; flag = 1;break;}sz[j] ++, a[i][j] ++;}}if(flag) break;}if(!flag) break;}fo(i, 0, m - 1) fo(j, 0, m - 1) if(a[i][j] > 0) {
#define DEBUG7 lookedge3
// write(all[i].back()); PAU; writeln(all[j].back());PushAns(i, j, all[i][ tail[i]-1 ], all[j][ tail[j]-1 ]);}fo(i, 0, n - 2) { write(Ans[i][0]); PAU; writeln(Ans[i][1]);}
}int main() {file(D);DB tt = clock();init();cerr << clock() - tt <<endl; DB ttt = clock();work();cerr<< clock() - ttt <<endl;cerr<< "Sumtime::" << clock() - tt <<endl;return 0;
}
CF411H 被遗忘的树 Havel定理 || 网络流相关推荐
- [matlab]havel定理证明(笔记)
[matlab]havel定理证明 是否可以由度序列生成简单图是图论中一个重要的内容. havel定理是解决这一问题的重要方法. havel定理证明 问题引出 简单图化问题 简单图 简单图即是指图上不 ...
- 图的度序列:Havel定理
给定一个非负整数序列{d1,d2,...dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化.进一步,若图为简单图,则称此序列可简单图化. 可图化的判定比较简单:d1+d2+.. ...
- POJ1659 Frogs' Neighborhood(Havel定理)
题目: Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Total Submissions: 9932 Accepted ...
- POJ 1659 Frogs‘ Neighborhood (Havel 定理)
Havel 定理: 序列的可图:给出一个 由非负整数组成的序列,如果是某个无向图的度序列,则称该序列是可图的. 而 Havel 定理,就是判断序列的可图的方法.先按度数从大到小排序, 每次处理完度数一 ...
- 【Havel 定理】Degree Sequence of Graph G
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2454 [别人博客粘贴过来的] 博客地址:https://www.cnblogs.com/debug ...
- 图的基本概念、握手定理、Havel定理
图 图论被广泛应用在计算机科学.运筹学.信息论.控制论.网络理论.博弈论.化学.生物学.物理学.社会科学.语言学等领域: 图论的应用方向1:以理论计算机科学和信息科学为研究背景,探索图论在计算机科学和 ...
- 生成树的计数 Matrix-Tree(矩阵树)定理
信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及.事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用.本文从一道信息学竞赛中出现的 ...
- 矩阵树 Matrix-Tree 定理实现模板(高斯消元求解行列式)
大佬1博客:https://www.cnblogs.com/zj75211/p/8039443.html 大佬2博客:https://www.cnblogs.com/yangsongyi/p/1069 ...
- AT4505-[AGC029F]Construction of a tree【构造题,hall定理,网络流】
正题 题目链接:https://www.luogu.com.cn/problem/AT4505 题目大意 给出nnn个点和n−1n-1n−1个点集UiU_iUi,每个点集中选择两个点连边使得该图是一 ...
最新文章
- Begin Your Service Journey
- Flex Builder 4.6 正式版eclipse插件利用BlazeDS于java交互实例
- JavaWeb-综合案例(用户信息)-学习笔记04【删除选中功能】
- django第三天(路由基础和路由分配)
- 共享一PYTHON 相关应用领域的介绍资料
- 洛谷——P1068 分数线划定
- iOS-项目常见文件
- Android 使用imageLoader来加载显示图片
- 揭秘 DockerCon 重量级演讲嘉宾(四)
- 搜索接口php,【微信公众平台开发】百度周边搜索接口php封装
- Vista下调整硬盘分区大小的方法
- Bill Gates 2007年哈佛演讲(中/英文)
- Tomcat服务器修改默认端口号
- 中国移动路由器怎么设置虚拟服务器,中国移动宽带无线wifi设置方法【图】
- 昂瑞微蓝牙芯片HS6620D调试记录
- CSS学习笔记(十)对表单和数据表格使用样式
- 让你平步青云的十个谈话技巧(转)
- EXCEL中条件格式中如果为真则停止的设置
- Git Stash 贮藏命令
- 39.超市微信促销活动5