【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 ...
随机推荐
- Splunk初识
目录 网址汇总 注册与下载 安装 使用 中文环境 关于APP Splunk自带的APP 创建自己的APP 添加数据 本地文件添加 通过监视添加数据 自定义列 查询语句 SPL 与 SQL对照 命令查找 ...
- tableau desktop
参考: 入门指南: https://help.tableau.com/current/guides/get-started-tutorial/zh-cn/get-started-tutorial-co ...
- sqlserver with(nolock)而mysql 不需nolock
nolock 是 SQL Server 特有的功能. 例如:对于一个表 A,更新了一行,还没有commit,这时再select * from A 就会死锁.用select * from A(noloc ...
- 单节点FastDFS安装
环境:centos7 1.什么是分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连. ...
- SIGCHLD和wait/waipid函数的关系
SIGCHILD只是在子进程退出的时候发送给父进程的一个信号值,这是一种异步通知父进程的方式.父进程可以捕获,忽略这个信号,默认动作是忽略此信号. 常用的使用方式是,当SIGCHILD信号发生时候,主 ...
- div css 布局对seo 影响 布局原则
一.代码精简 使用DIV+CSS布局,页面代码精简,这一点相信对XHTML有所了解的都知道.代码精简所带来的直接好处有两点:一是提高蜘蛛爬行效率,能在最短的时间内爬完整个页面,这样对收录质量有一定好处 ...
- HTTP常用状态码详解
HTTP状态码: HTTP定义遵循一条规则:所有状态码的第一个数字代表了响应的状态.1表示消息:2表示成功:3表示重定向:4表示请求错误:5.6表示服务器错误.如下图: 1xx: 这一类型的状态码,代 ...
- springboot中的编码设置
在springboot中编码配置可以通过filter也可以通过springboot的核心配置文件application.properties中配置如下信息: #配置字符编码spring.http.en ...
- Android 组件化之路 资源冲突问题
比如我现在有3个模块:app模块,user模块,me模块,其中app模块依赖user模块和me模块. 然后我在user模块和me模块的strings.xml中都定义了greet字符串: // user ...
- 【总结】Android 应用测试总结
前提 所有的功能分支已完成 启动: 1. 启动入口:桌面正常启动,最近运行启动,所有程序列表中启动,锁屏快捷启动2. 其他入口:从其他程序开启应用,从外部以文件形式打开应用(如果有)3. 退回:从其他 ...