[JZOJ5495]【清华集训2017模拟12.09】MiniumCut
2017-12-20 21:31
627 查看
Description
有一个无向图给出两两点间的最小割
构造出这个图,输出任意一种
对于 100% 的数据, n<=100
Solution
利用最小割树的性质来考虑两两点的最小割等于这两点在最小割树上的路径边权最小值
相当于给出了完全图,要求这样一个生成树,使得生成树上任意两个点之间的边最小值等于这原图中这两个点直连边的边权
那么就是这个图的最大生成树
为什么呢?
考虑新加入一条边,因为是最大生成树,所以这条边是比之前所有的都要小
如果这条边连接的两个点已经连接了,那么这条边的边权是小于等于之前所有边的
又根据最小割的性质
mincut(a,b)≥min(mincut(a,c1),mincut(c1,c2),...,mincut(cm,b))
那么他又需要满足这条边的边权大于等于这条路径上的边权最小值
得证!
那么直接按照这样构出最大生成树,再判断是否合法
可以发现直接这样连边就满足题设
复杂度O(N2log(N2))
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 105 using 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 ,dis ,pl ,nt[2*N],fs ,dt[2*N],pr[2*N],n,m,l,d ; 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); }
相关文章推荐
- 【JZOJ 5495】【清华集训2017模拟12.09】MiniumCut(最小割树)
- JZOJ 5496. 【清华集训2017模拟12.09】Tree
- jzoj5317 【清华集训2017模拟8.19】func (寻找性质)
- JZOJ5484. 【清华集训2017模拟11.26】快乐树
- [jzoj]5483. 【清华集训2017模拟11.26】简单路径
- 【JZOJ 5284】【清华集训2017模拟】超级翻转
- 【清华集训2017模拟12.09】塔
- JZOJ 5500. 【清华集训2017模拟12.10】营养餐
- 【JZOJ5317】【清华集训2017模拟8.19】func
- JZOJ5498. 【清华集训2017模拟12.10】大佬的难题
- 【JZOJ 5276】【清华集训2017模拟】神奇的玩具
- 【JZOJ 5500】【清华集训2017模拟12.10】营养餐
- [JZOJ5485]【清华集训2017模拟11.26】字符串
- 【JZOJ5296】【清华集训2017模拟】Sequence
- JZOJ 5483. 【清华集训2017模拟11.26】简单路径
- 【JZOJ 5295】【清华集训2017模拟】Create
- [jzoj]5484. 【清华集训2017模拟11.26】快乐树(树形DP)
- JZOJ 5489. 【清华集训2017模拟11.28】海明距离
- 【JZOJ5295】【清华集训2017模拟】Create
- 【JZOJ 5296】【清华集训2017模拟】Sequence