[JZOJ5495]【清华集训2017模拟12.09】MiniumCut
来源:互联网 发布:王昱珩 知乎 编辑:程序博客网 时间:2024/06/05 11:54
Description
有一个无向图
给出两两点间的最小割
构造出这个图,输出任意一种
对于 100% 的数据, n<=100
Solution
利用最小割树的性质来考虑
两两点的最小割等于这两点在最小割树上的路径边权最小值
相当于给出了完全图,要求这样一个生成树,使得生成树上任意两个点之间的边最小值等于这原图中这两个点直连边的边权
那么就是这个图的最大生成树
为什么呢?
考虑新加入一条边,因为是最大生成树,所以这条边是比之前所有的都要小
如果这条边连接的两个点已经连接了,那么这条边的边权是小于等于之前所有边的
又根据最小割的性质
那么他又需要满足这条边的边权大于等于这条路径上的边权最小值
得证!
那么直接按照这样构出最大生成树,再判断是否合法
可以发现直接这样连边就满足题设
复杂度
Code
#include <cstdio>#include <cstdlib>#include <iostream>#include <algorithm>#include <cmath>#include <cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)#define N 105using namespace std;struct node{ int x,y,z; friend bool operator <(node x,node y) { return x.z>y.z; }}a[N*N];int f[N],dis[N],pl[N][N],nt[2*N],fs[N],dt[2*N],pr[2*N],n,m,l,d[N];void link(int x,int y,int z){ nt[++m]=fs[x]; dt[fs[x]=m]=y; pr[m]=z;}int getf(int k){ if(f[k]==0||f[k]==k) return k; return f[k]=getf(f[k]);}void dfs(int k,int fa,int s){ dis[k]=s; if(fa==0) dis[k]=0; for(int i=fs[k];i;i=nt[i]) { if(dt[i]!=fa) dfs(dt[i],k,min(s,pr[i])); }}int main(){ cin>>n; fo(i,1,n) { fo(j,1,n) { scanf("%d",&pl[i][j]); if(i>j&&pl[i][j]!=pl[j][i]) { printf("-1\n"); return 0; } if(i<j) a[++l].x=i,a[l].y=j,a[l].z=pl[i][j]; } } sort(a+1,a+l+1); for(int i=1,j=0;i<=l&&j<n-1;i++) { int fx=getf(a[i].x),fy=getf(a[i].y); if(fx!=fy) link(a[i].x,a[i].y,a[i].z),link(a[i].y,a[i].x,a[i].z),f[fx]=fy,d[++j]=i; } fo(i,1,n) { memset(dis,107,sizeof(dis)); dfs(i,0,1802201963); fo(j,1,n) { if(dis[j]!=pl[i][j]) { printf("-1\n"); return 0; } } } printf("%d\n",n-1); fo(i,1,n-1) printf("%d %d %d\n",a[d[i]].x,a[d[i]].y,a[d[i]].z);}
阅读全文
0 0
- [JZOJ5495]【清华集训2017模拟12.09】MiniumCut
- 【JZOJ 5495】【清华集训2017模拟12.09】MiniumCut(最小割树)
- 【清华集训2017模拟12.09】塔
- 【清华集训2017模拟12.09】Tree
- 【清华集训2017模拟】ces
- 【清华集训2017模拟】Sequence
- 【清华集训2017模拟】Catalan
- 【清华集训2017模拟】Create
- 【清华集训2017模拟】Sequence
- JZOJ 5496. 【清华集训2017模拟12.09】Tree
- 【JZOJ 5295】【清华集训2017模拟】Create
- 【JZOJ 5296】【清华集训2017模拟】Sequence
- 5296. 【清华集训2017模拟】Sequence 树套树
- jzoj5316 【清华集训2017模拟8.19】merge
- 【JZOJ5295】【清华集训2017模拟】Create
- 【JZOJ5296】【清华集训2017模拟】Sequence
- 【JZOJ5316】【清华集训2017模拟8.19】merge
- 【JZOJ5317】【清华集训2017模拟8.19】func
- 使用IjkMediaPlayer结合surface
- 浅谈oracle优化中物化视图的查询重写
- 关于codeforces比赛规则介绍
- 图的遍历与最小生成树
- 博弈问题总集第三类----Staircase Nim
- [JZOJ5495]【清华集训2017模拟12.09】MiniumCut
- CSDN-markdown编辑器教程
- 配置远程maven仓库
- 搭建 FTP 文件服务
- c语言复习
- 类加载过程
- JSP
- Spring Boot自动配置实战
- 利用UDP实现双向聊天系统