【CF1252L】Road Construction(基环树,最大流)
题意:给定一张n点n边无重边自环的无向图,刚开始每条边都没有被选择,每条边上有一个颜色集合,必须从中选择一种
有K个工人,每个工人有颜色a[i],需要把工人分配到与其颜色相同的边上
问是否能有一种使得n个点完全联通的方案,如果有则输出
n,K<=2000
思路:考虑n-1条边的树的弱化版,显然每条边都应该被选择,用颜色和边建图跑最大流即可
n点n边的基环树的情况下需要把环抠出来,设环的大小为size,两个端点至少有一个在环中的为A集合,其余为B集合
显然B集合中所有的边都需要被选取,A集合中至多只能选择size-1条
可以另外加源或者汇限制A集合的流量,也可以先加入B集合中的所有边,先跑最大流,判断是否小于n-size,因为A集合至多只有size-1的流量
两种方法都试过,都很快
我猜题解里写的应该就是用最大流跑的匹配,没听说过有能跑这个多重匹配的新算法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,ll>P;
#define N 200010
#define M 1000000
#define INF 1e9
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1
#define fors(i) for(auto i:e[x]) if(i!=p) const int MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int dx[]={-,,,};
int dy[]={,,-,}; int head[N],vet[N],len[N],nxt[N],inq[N],inc[N],a[N],
flag[N],vis[N],stk[N],dis[N],p[N],c[N],match[N],
tot,top,s,S,T,T1; VI b[N],co[N]; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} ll readll()
{
ll v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void add(int a,int b)
{
nxt[++tot]=head[a];
vet[tot]=b;
head[a]=tot;
} void Add(int a,int b,int c)
{
nxt[++tot]=head[a];
vet[tot]=b;
len[tot]=c;
head[a]=tot; nxt[++tot]=head[b];
vet[tot]=a;
len[tot]=;
head[b]=tot;
} void findc(int u,int fa)
{
stk[++top]=u;
inq[u]=vis[u]=;
int e=head[u];
while(e)
{
int v=vet[e];
if(!vis[v]) findc(v,u);
else if(v!=fa&&inq[v])
{
int s=,t=top;
while()
{
t--;
s++;
if(stk[t]==v) break;
}
if(s>=)
{
t=top;
while()
{
inc[stk[t]]=;
t--;
if(stk[t]==v){inc[v]=; break;}
} }
}
e=nxt[e];
}
inq[stk[top]]=;
top--;
} int bfs()
{
queue<int> q;
rep(i,,s) dis[i]=-;
q.push(S),dis[S]=;
while(!q.empty())
{
int u=q.front();
q.pop();
int e=head[u];
while(e)
{
int v=vet[e];
if(len[e]&&dis[v]==-)
{
dis[v]=dis[u]+;
q.push(v);
}
e=nxt[e];
}
}
return dis[T]!=-;
} int dfs(int u,int aug)
{
if(u==T) return aug;
int e=head[u],val=,flow=;
while(e)
{
int v=vet[e];
if(len[e]&&dis[v]==dis[u]+)
{
int t=dfs(v,min(len[e],aug));
if(!t)
{
e=nxt[e];
continue;
}
flow+=t;
aug-=t;
len[e]-=t;
len[e^]+=t;
if(!aug) break;
}
e=nxt[e];
}
if(!flow) dis[u]=-;
return flow;
} int main()
{
int n=read(),K=read();
int m=;
rep(i,,n)
{
p[i]=read();
int x=read();
while(x--)
{
int y=read();
b[i].pb(y);
c[++m]=y;
}
}
rep(i,,K)
{
a[i]=read();
c[++m]=a[i];
}
sort(c+,c+m+);
int k=unique(c+,c+m+)-c-;
rep(i,,n)
for(int j=;j<b[i].size();j++) b[i][j]=lower_bound(c+,c+k+,b[i][j])-c; rep(i,,k) co[i].clear();
rep(i,,K)
{
a[i]=lower_bound(c+,c+k+,a[i])-c;
co[a[i]].pb(i);
} tot=;
rep(i,,n)
{
add(i,p[i]);
add(p[i],i);
}
findc(,);
s=k+n,S=++s,T=++s;
rep(i,,s) head[i]=;
tot=;
int sz=;
rep(i,,k) Add(S,i,co[i].size());
rep(i,,n)
for(int j=;j<b[i].size();j++) Add(b[i][j],i+k,);
rep(i,,n)
if(inc[i]==||inc[p[i]]==) Add(i+k,T,);
else sz++;
int ans=;
while(bfs()) ans+=dfs(S,INF);
if(ans<(n--(sz-)))
{
printf("-1\n");
return ;
}
rep(i,,n)
if(inc[i]&&inc[p[i]]) Add(i+k,T,);
while(bfs()) ans+=dfs(S,INF);
if(ans<n-) printf("-1\n");
else
{
rep(i,,n) flag[i]=;
rep(i,,k)
{
int e=head[i],j=;
while(e)
{
int v=vet[e];
if(v>=k+&&v<=k+n&&flag[v-k]==&&!len[e])
{
j++;
if(j>(int)co[i].size()) break;
int t=co[i][j-];
match[t]=v-k;
flag[v-k]=;
}
e=nxt[e];
}
}
rep(i,,K) printf("%d %d\n",match[i],p[match[i]]);
} return ;
}
【CF1252L】Road Construction(基环树,最大流)的更多相关文章
- POJ3352 Road Construction (双连通分量)
Road Construction Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- POJ P3352 Road Construction 解题报告
P3352 Road Construction 描述 这几乎是夏季,这意味着它几乎是夏季施工时间!今年,负责岛屿热带岛屿天堂道路的优秀人士,希望修复和升级岛上各个旅游景点之间的各种道路. 道路本身也很 ...
- [POJ3352]Road Construction
[POJ3352]Road Construction 试题描述 It's almost summer time, and that means that it's almost summer cons ...
- POJ3352 Road Construction(边双连通分量)
...
- poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10141 Accepted: 503 ...
- POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
POJ 3177 Redundant Paths POJ 3352 Road Construction 题目链接 题意:两题一样的.一份代码能交.给定一个连通无向图,问加几条边能使得图变成一个双连通图 ...
- 【BZOJ1791】【IOI2008】【基环树】island(status第一速度)
1791: [Ioi2008]Island 岛屿 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 908 Solved: 159 [Su ...
- POJ3352 Road Construction 双连通分量+缩点
Road Construction Description It's almost summer time, and that means that it's almost summer constr ...
- 【Tarjan缩点】PO3352 Road Construction
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12532 Accepted: 630 ...
随机推荐
- 交换机安全学习笔记 第二章 MAC地址泛洪攻击
本文为书中相关知识的摘要,由于书中以思科设备为配置依据,所以笔记中补充了华为.H3C设备的相关配置.华为设备配置参考华为S2352EI 产品版本:V100R005C01文档版本:02. H3C配置参 ...
- sql server CDC报错:超出存储过程、函数、触发器的最大嵌套层数(最大层为32)
sys.sp_MScdc_capture_job RAISERROR(22801, 10, -1) --原本 go sys.sp_MScdc_capture_job; go --修改后 ...
- 区间和序列上的dp
区间上的dp状态设计最基本的形式: \(F[i]\)表示以i结尾的最优值或方案数. \(F[i][k]\)表示以i结尾附加信息为k的最优值或方案数. 当然可以有多维附加信息. 转移的话往往是枚举上一个 ...
- 139. 回文子串的最大长度(回文树/二分,前缀,后缀和,Hash)
题目链接 : https://www.acwing.com/problem/content/141/ #include <bits/stdc++.h> using namespace st ...
- 开发跨平台应用解决方案-uniapp 真心不错,支持一波
uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架,开发者编写一套代码,可编译到iOS.Android.微信小程序等多个平台. 用了mui,H5+一年多了,感觉dcloud 最近推出的 ...
- C++ 内联函数 inline关键字
inline 关键字主要功能是为了 代替掉 宏代码片段. 在C++中使用关键字inline关键字声明内联函数. inline int fun(int a,int b) { return a < ...
- vue.js的v-bind
v-bind v-bind 主要用于属性绑定, html中的标签内: <div class="control-group"> <label class=&quo ...
- RabbitMQ入门教程(十五):普通集群和镜像集群
原文:RabbitMQ入门教程(十五):普通集群和镜像集群 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...
- MySQL数据库入门常用基础命令
MySQL数据库入门———常用基础命令 数据——公司的生命线,因此在大多数的互联网公司,都在使用开源的数据库产品,MySQL也因此关注度与使用率非常的高,所以做为运维的屌丝们,掌握它的一些基 ...
- SOA架构简介
一. 什么是SOA 架构 SOA是一种架构模型,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使用.服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的 ...