传送门

题目大意

给定$n$个点$m$条边的无向图,有$K$个关键点,你要尽可能的让这些关键点两两匹配,使得所有点对之间可以通过简单路径连接且任意两个简单路径没有重复的边(可以是共同经过一个点),输出每一条这样的路径。

$K\leq n,m\leq 5\times 10^4$

题解

很显然对于每一个连通块,当且仅当它有奇数个关键点,那么它会有一个关键点没有被配对,否则一定可以满足两两配对。

考虑该联通块的任意一棵生成树,不考虑是否经过了同一条边,任意两两沿着树上简单路径染边。

若有$(a,b)\cap (c,d) = (p,q)$其中$(x,y)$表示从$x,y$之间的简单路径(设$a,c$在$p$的同侧)。

那么只需要令$a,c$配对,$c,d$配对即可。

至于方案数,任意选择一棵生成树进行搜索即可,$G_x$表示以$x$为根的子树内没有配对的点是多少(若没有则$G_x=0$)。

枚举$x$的每个儿子$v$,若$G_v=0$就忽略,否则,若$G_x=0$,那么令$G_x=G_v$,不然就新建一条以$x$为$lca$的,一端是$G_x$一端是$G_v$的路径,再让$G_x=0$即可。

复杂度$O(n)$。

#include<bits/stdc++.h>
#define LL long long
#define M 100020
using namespace std;
namespace IO{
const int BS=(1<<20)+5; int Top=0;
char Buffer[BS],OT[BS],*OS=OT,*HD,*TL,SS[20]; const char *fin=OT+BS-1;
char Getchar(){if(HD==TL){TL=(HD=Buffer)+fread(Buffer,1,BS,stdin);} return (HD==TL)?EOF:*HD++;}
void flush(){fwrite(OT,1,OS-OT,stdout);}
void Putchar(char c){*OS++ =c;if(OS==fin)flush(),OS=OT;}
void write(int x){
if(!x){Putchar('0');return;} if(x<0) x=-x,Putchar('-');
while(x) SS[++Top]=x%10,x/=10;
while(Top) Putchar(SS[Top]+'0'),--Top;
}
int read(){
int nm=0,fh=1; char cw=Getchar();
for(;!isdigit(cw);cw=Getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=Getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
}
using namespace IO;
int n,K,m,fs[M],to[M],G[M],nt[M],fa[M],u[M],v[M],t[M],tot,tmp;
int s1[M],s2[M]; bool vs[M];
#define link(a,b) nt[tmp]=fs[a],fs[a]=tmp,to[tmp++]=b
#define ins(a,b,c) tot++,u[tot]=a,v[tot]=b,t[tot]=c
void dp(int x){
G[x]=vs[x]?x:0;
for(int i=fs[x];i!=-1;i=nt[i]){
if(fa[to[i]]) continue;
fa[to[i]]=x,dp(to[i]);
if(!G[to[i]]) continue;
if(!G[x]) G[x]=G[to[i]];
else ins(G[x],G[to[i]],x),G[x]=0;
}
}
void opt(int x,int y,int k){
int tp1=0,tp2=0;
while(x!=k) s1[++tp1]=x,x=fa[x];
while(y!=k) s2[++tp2]=y,y=fa[y];
write(tp1+tp2),Putchar(' ');
for(int i=1;i<=tp1;i++) write(s1[i]),Putchar(' '); write(k);
for(int i=tp2;i>=1;i--) Putchar(' '),write(s2[i]); Putchar('\n');
}
int main(){
n=read(),m=read(),K=read(),memset(fs,-1,sizeof(fs));
for(int i=1;i<=m;i++){int x=read(),y=read();link(x,y),link(y,x);}
for(int i=1;i<=K;i++) vs[read()]=true;
for(int i=1;i<=n;i++) if(!fa[i]) fa[i]=i,dp(i);
write(tot),Putchar('\n');
for(int i=1;i<=tot;i++) opt(u[i],v[i],t[i]);
flush(); return 0;
}

  

CodeForces 589H Tourist Guide的更多相关文章

  1. [uva] 10099 - The Tourist Guide

    10099 - The Tourist Guide 题目页:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemi ...

  2. UVa10099_The Tourist Guide(最短路/floyd)(小白书图论专题)

    解题报告 题意: 有一个旅游团如今去出游玩,如今有n个城市,m条路.因为每一条路上面规定了最多可以通过的人数,如今想问这个旅游团人数已知的情况下最少须要运送几趟 思路: 求出发点到终点全部路其中最小值 ...

  3. floyd类型题UVa-10099-The Tourist Guide +Frogger POJ - 2253

    The Tourist Guide Mr. G. works as a tourist guide. His current assignment is to take some tourists f ...

  4. codeforces 340C Tourist Problem

    link:http://codeforces.com/problemset/problem/340/C 开始一点也没思路,赛后看别人写的代码那么短,可是不知道怎么推出来的啊! 后来明白了. 首先考虑第 ...

  5. codeforces 340C Tourist Problem(公式题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Tourist Problem Iahub is a big fan of tou ...

  6. Codeforces 732F. Tourist Reform (Tarjan缩点)

    题目链接:http://codeforces.com/problemset/problem/732/F 题意: 给出一个有n个点m条边的无向图,保证联通,现在要求将所有边给定一个方向使其变成有向图,设 ...

  7. codeforces 340C Tourist Problem(简单数学题)

    题意:固定起点是0,给出一个序列表示n个点,所有点都在一条直线上,其中每个元素代表了从起点到这个点所走的距离.已知路过某个点不算到达这个点,则从起点出发,到达所有点的方案有许多种.求所有方案走的总路程 ...

  8. CodeForces 732F Tourist Reform

    边双连通分量. 这题有一点构造的味道.一个有向图,经过强连通缩点之后会形成一个有向无环图. 如果将最大的强连通分量放在顶端,其余的强连通分量都直接或间接指向他,那么这样就构造出了符合要求的图. 接下来 ...

  9. CodeForces - 76F:Tourist (旋转坐标系,LIS)

    pro:有一个驴友,以及给定N个表演地点xi和时间ti,驴友的速度不能超过V. 问他在起点为原点和不设置起点的情况下分别最多参观多少个表演. sol:BZOJ接飞饼见过:clari也在camp的DP专 ...

随机推荐

  1. DES算法解析

    DES算法  美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告. 1977年1月,美国 ...

  2. XP、win7下Excel 2007多窗口打开Excel的解决方法

    http://blog.x6x8.com/?p=330 Win7下的方法(借鉴了XP的方法): 1.先在桌面先建一个txt文件,将下面的代码复制进去 32位WIN7复制下面一行start “Excel ...

  3. 在html中插入音频

    在html中插入音频 第一种:在页面代码中的<head></head>之间加入<bgsound src="音乐url" loop="-1&q ...

  4. Incomplete response received from application

    RAILS_ENV=production rake secret 将输出的一大串字码粘贴到rails工程中/config/secrets.yml去,替换掉该文件中的<%= ENV["S ...

  5. 防止基本的XSS攻击 滤掉HTML标签

    /** * 防止基本的XSS攻击 滤掉HTML标签 * 将HTML的特殊字符转换为了HTML实体 htmlentities * 将#和%转换为他们对应的实体符号 * 加上了$length参数来限制提交 ...

  6. EF删除集中方法对比

    // DELETE api/<controller>/5 [HttpGet] public void delete(string id) { #region 官方推荐写法 /* var a ...

  7. Linux Shell基础 多个命令中的分号(;)、与(&&) 、 或(||)

    概述 在 Bash 中,如果需要让多条命令按顺序执行,则有这样方法,如表 1 所示. 多命令执行符 格 式 作 用 : 命令1 ; 命令2 多条命令顺序执行,命令之间没有任何逻辑关系 &&am ...

  8. Linux文件系统管理 文件系统

    概述 文件系统:文件系统这个名词大家都很陌生,不过如果说成分区,大家就比较容易理解了.原先每个分区只能格式化为一个文件系统,所以我们可以认为文件系统就是指分区.不过随着技术的进步,现在一个文件系统可以 ...

  9. 主攻ASP.NET MVC4.0之重生:Jquery Mobile 按钮+对话框使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. get_called_class--后期静态绑定("Late Static Binding")类的名称

    get_called_class--后期静态绑定("Late Static Binding")类的名称 string get_called_class ( void ) 获取静态方 ...