wa on #7求条【玄1关,先到先得】
查看原帖
wa on #7求条【玄1关,先到先得】
865625
KobeBeanBryantCox楼主2024/7/31 23:29

rt.

#include<bits/stdc++.h>
#define Code using
#define by namespace
#define wjb std
Code by wjb;
int in()
{
    int k=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')k=k*10+c-'0',c=getchar();
    return k*f;
}
void out(int x)
{
    if(x<0)putchar('-'),x=-x;
    if(x<10)putchar(x+'0');
    else out(x/10),putchar(x%10+'0');
}
const int N=5e5+10;
vector<int>e[N];
int fa[N],dep[N];
int pos=0;
vector<int>leaf;
void find(int u,int f,int d)
{
    dep[u]=d,fa[u]=f;
    if(d>dep[pos])pos=u;
    bool flag=0;
    for(int v:e[u])
        if(!dep[v])flag=true,find(v,u,d+1);
    if(!flag)leaf.push_back(u);
}
void print(int u,int x,int op=0)
{
    if(dep[u]<dep[x])swap(u,x);
    out(dep[u]-dep[x]+1+(op!=0)),putchar('\n');
    if(op)out(op),putchar(' ');
    for(;u!=fa[x];u=fa[u])out(u),putchar(' ');
    putchar('\n');
}
int main()
{
    int n=in(),m=in(),k=in();
    while(m--)
    {
        int u=in(),v=in();
        e[u].push_back(v),e[v].push_back(u);
    }
    find(1,0,1);
    int root=pos;
    memset(fa,0,sizeof(fa)),memset(dep,0,sizeof(dep));
    pos=0,find(root,0,1);
    if(dep[pos]>=ceil(n*1.0/k))puts("PATH"),print(pos,root);
    else if(leaf.size()<k)puts("-1");
    else
    {
        puts("CYCLES");
        for(int i=0;i<k;i++)
        {
            int u=leaf[i],x=e[u][0],y=e[u][1];
            if(x==fa[u])x=e[u][2];
            if(y==fa[u])y=e[u][2];
            if((dep[u]-dep[x]+1)%3!=0)print(u,x);
            else if((dep[u]-dep[y]+1)%3!=0)print(u,y);
            else print(x,y,u);
        }
    }
    return 0;
}
2024/7/31 23:29
加载中...