不知道为什么现在这场比赛关闭了,我的代码在校内OJ上是AC了的
http://codeforces.com/contest/589
题解:
显然随便拿一个图的生成树去做就行了。
这种题。。。怎么开心怎么玩是吧。。。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define gc get_char
#define cs const
namespace IO{
inline char get_char(){
static cs int Rlen=1<<22|1;
static char buf[Rlen],*p1,*p2;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,Rlen,stdin),p1==p2)?EOF:*p1++;
}
template<typename T>
inline T get(){
char c;
while(!isdigit(c=gc()));T num=c^48;
while(isdigit(c=gc()))num=(num+(num<<2)<<1)+(c^48);
return num;
}
inline int getint(){return get<int>();}
}
using namespace IO;
using std::cerr;
using std::cout;
using pii=std::pair<int,int>;
#define fi first
#define se second
cs int N=6e4+5;
int n,m,k;
std::vector<int> G[N];
inline void addedge(int u,int v){
G[u].push_back(v);
G[v].push_back(u);
}
bool sp[N],vis[N];
int dep[N],fa[N];
std::vector<pii> p;
int dfs(int u,int pa){
vis[u]=true;
int last=sp[u]?u:0;
for(int re v:G[u])if(!vis[v]){
dep[v]=dep[u]+1;fa[v]=u;
int t=dfs(v,u);
if(t){
if(last){
p.push_back(pii(last,t));
last=0;
}
else last=t;
}
}
return last;
}
int a[N],acnt,b[N],bcnt;
inline void work(int u,int v){
acnt=bcnt=0;
while(u!=v)dep[u]>dep[v]?(a[++acnt]=u,u=fa[u]):(b[++bcnt]=v,v=fa[v]);
cout<<acnt+bcnt<<" ";
for(int re i=1;i<=acnt;++i)cout<<a[i]<<" ";
cout<<u<<" ";
for(int re i=bcnt;i;--i)cout<<b[i]<<" ";
cout<<"\n";
}
int bel[N];
inline int get_fa(int x){return x==bel[x]?x:bel[x]=get_fa(bel[x]);}
signed main(){
// freopen("b.in","r",stdin);//freopen("b.out","w",stdout);
n=getint(),m=getint(),k=getint();
for(int re i=1;i<=n;++i)bel[i]=i;
for(int re i=1;i<=m;++i){
int u=getint(),v=getint();
if(get_fa(u)!=get_fa(v)){
addedge(u,v);
bel[bel[u]]=bel[v];
}
}
for(int re i=1;i<=k;++i)sp[getint()]=true;
for(int re i=1;i<=n;++i)if(!vis[i])dfs(i,0);
cout<<p.size()<<"\n";
for(pii t:p)work(t.fi,t.se);
exit(0);
}