博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj千题计划140:bzoj4519: [Cqoi2016]不同的最小割
阅读量:5302 次
发布时间:2019-06-14

本文共 2622 字,大约阅读时间需要 8 分钟。

 

最小割树

 

#include
#include
#include
#include
#include
using namespace std; #define N 900#define M 9000const int inf=2e9; int n; int tot=1;int front[N],nxt[M<<1],to[M<<1],val[M<<1],from[M<<1];int lev[N],num[N];int path[N];int cur[N]; int src,decc; int a[N],tmp[N];bool use[N]; int dis[N][N];int ans[361350]; void read(int &x){ x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }} void add(int u,int v,int w){ to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; from[tot]=u; val[tot]=w;} bool bfs(){ queue
q; for(int i=1;i<=n;++i) lev[i]=n; q.push(decc); lev[decc]=0; int now,t; while(!q.empty()) { now=q.front(); q.pop(); for(int i=front[now];i;i=nxt[i]) { t=to[i]; if(lev[t]==n && val[i^1]) { lev[t]=lev[now]+1; q.push(t); } } } return lev[src]!=n;} int augment(){ int now=decc,flow=inf; int i; while(now!=src) { i=path[now]; flow=min(flow,val[i]); now=from[i]; } now=decc; while(now!=src) { i=path[now]; val[i]-=flow; val[i^1]+=flow; now=from[i]; } return flow;} int isap(){ int flow=0; if(!bfs()) return 0; memset(num,0,sizeof(num)); for(int i=1;i<=n;++i) num[lev[i]]++,cur[i]=front[i]; int now=src,t; while(lev[src]
>1; src=a[l]; decc=a[r]; int flow=isap(); memset(use,false,sizeof(use)); dfs(src); for(int i=1;i<=n;++i) if(use[i]) for(int j=1;j<=n;++j) if(!use[j]) dis[i][j]=dis[j][i]=min(dis[i][j],flow); int i=l,j=r; for(int k=l;k<=r;++k) if(use[a[k]]) tmp[i++]=a[k]; else tmp[j--]=a[k]; for(int k=l;k<=r;++k) a[k]=tmp[k]; solve(l,i-1); solve(j+1,r);} int main(){ int m; int u,v,w; memset(dis,127,sizeof(dis)); read(n); read(m); for(int i=1;i<=n;++i) a[i]=i; while(m--) { read(u); read(v); read(w); add(u,v,w); add(v,u,w); } solve(1,n); int sum=0; for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j) ans[++sum]=dis[i][j]; sort(ans+1,ans+sum+1); sum=unique(ans+1,ans+sum+1)-ans-1; cout<

 

4519: [Cqoi2016]不同的最小割

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 866  Solved: 499
[][][]

Description

学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成
两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割。对于带权图来说,将
所有顶点处在不同部分的边的权值相加所得到的值定义为这个割的容量,而s,t的最小割指的是在
关于s,t的割中容量最小的割。
而对冲刺NOI竞赛的选手而言,求带权图中两点的最小割已经不是什么难事了。我们可以把
视野放宽,考虑有N个点的无向连通图中所有点对的最小割的容量,共能得到N(N−1)
2个数值。
这些数值中互不相同的有多少个呢?这似乎是个有趣的问题。
 

Input

输入文件第一行包含两个数N,M,表示点数和边数。接下来M行,每行三个数u,v,w,
表示点u和点v(从1开始标号)之间有条边权值是w。
1<=N<=850 1<=M<=8500 1<=W<=100000
 

Output

 输出文件第一行为一个整数,表示个数。

 

Sample Input

4 4
1 2 3
1 3 6
2 4 5
3 4 4

Sample Output

3

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8042852.html

你可能感兴趣的文章
python tkinter GUI绘制,以及点击更新显示图片
查看>>
HDU4405--Aeroplane chess(概率dp)
查看>>
CS0103: The name ‘Scripts’ does not exist in the current context解决方法
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
Spring面试题
查看>>
窥视SP2010--第一章节--SP2010开发者路线图
查看>>
MVC,MVP 和 MVVM 的图示,区别
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
虚拟DOM
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>