CEOI2017 day1-oneway【DFS序】

来源:互联网 发布:ketchup mac免费 编辑:程序博客网 时间:2024/06/06 12:33

环上的边都是B,路径直接在DFS树上打标机就可以了。

代码

#include<cstdio>#include<cstring>#include<algorithm>#define maxn 100006using namespace std;inline char nc(){    static char buf[100000],*i=buf,*j=buf;    return i==j&&(j=(i=buf)+fread(buf,1,100000,stdin),i==j)?EOF:*i++;}inline int _read(){    char ch=nc();int sum=0;    while(!(ch>='0'&&ch<='9'))ch=nc();    while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();    return sum;}struct data{    int x,y;}s[maxn];int n,e,m,tot,dep[maxn],f1[maxn],f2[maxn],lnk[maxn],son[maxn*2],nxt[maxn*2],id[maxn*2];bool vis[maxn],vis1[maxn*2],a[maxn],b[maxn];char ans[maxn];void add(int x,int y,int z){    nxt[++tot]=lnk[x];son[tot]=y;lnk[x]=tot;id[tot]=z;}void dfs1(int x){    vis[x]=0;    for(int j=lnk[x];j;j=nxt[j])     if(vis[son[j]])vis1[id[j]]=0,dfs1(son[j]);else     if(vis1[id[j]])ans[id[j]]='B',vis1[id[j]]=0,f1[x]++,f1[son[j]]--;}void dfs2(int x){    vis[x]=0;    for(int j=lnk[x];j;j=nxt[j]) if(vis[son[j]]){        dep[son[j]]=dep[x]+1;        dfs2(son[j]);        if(f1[son[j]]>0)ans[id[j]]='B';else        if((f2[son[j]]>0&&(j&1))||(f2[son[j]]<0&&(!(j&1))))ans[id[j]]='L';else        if((f2[son[j]]<0&&(j&1))||(f2[son[j]]>0&&(!(j&1))))ans[id[j]]='R';        f1[x]+=f1[son[j]];f2[x]+=f2[son[j]];    }}int main(){    freopen("oneway.in","r",stdin);    freopen("oneway.out","w",stdout);    n=_read();e=_read();    for(int i=1,x,y;i<=e;i++)s[i].x=_read(),s[i].y=_read(),add(s[i].x,s[i].y,i),add(s[i].y,s[i].x,i);    m=_read();    for(int i=1,x,y;i<=m;i++)x=_read(),y=_read(),f2[x]++,f2[y]--;    memset(vis,1,sizeof(vis));memset(vis1,1,sizeof(vis1));    for(int i=1;i<=n;i++) if(vis[i])dfs1(i);    memset(vis,1,sizeof(vis));    for(int i=1;i<=n;i++) if(vis[i])dfs2(i);    for(int i=1;i<=e;i++)     if(ans[i]==0)printf("B");else printf("%c",ans[i]);    return 0;}
原创粉丝点击