求问,为什么加上这句之后就会T
查看原帖
求问,为什么加上这句之后就会T
1070708
Caged_Bird楼主2024/12/29 21:03
#include<bits/stdc++.h>
#define int long long
#define N 300005
using namespace std;
inline void print(int n){if(n<0){putchar('-');print(-n);return;}if(n>9)print(n/10);putchar(n%10+'0');}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
struct node{
    int to,dis;
};
int n,m,x[N],y[N];
int fa[N],tot,siz[N],rt;
vector<int>p;
vector<node>a[N];
int find(int x){
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
void dfs(int now,int fa){
    if(tot>=p.size())return;
    if(siz[now]==1&&now!=rt&&now!=0){
        while(tot<p.size()){
            if(p[tot]==rt){
                tot++;
                continue;
            }
            // a[now].push_back(node{p[tot],0});
            a[fa].push_back(node{p[tot],0});
            a[p[tot]].push_back(node{fa,0});
            a[p[tot]].push_back(node{now,0});
            for(int i=0;i<a[now].size();i++){
                if(a[now][i].to==fa)a[now][i].dis=1;
            }
            for(int i=0;i<a[fa].size();i++){
                if(a[fa][i].to==now)a[fa][i].dis=1;
            }
            fa=p[tot];
            siz[p[tot]]+=2;
            tot++;
        }
        return;
    }
    for(auto i:a[now]){
        if(i.to==fa||i.dis||i.to==0||now==0)continue;
        dfs(i.to,now);
        if(tot>=p.size())return;
    }
}
void print(int now,int fa){
    for(auto i:a[now]){
        if(i.to==fa||i.dis||i.to==0||now==0)continue;
        print(now);putchar(' ');print(i.to);putchar('\n');
        print(i.to,now);
    }
}
signed main(){
    n=read();m=read();
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=m;i++){
        x[i]=read();y[i]=read();
        a[x[i]].push_back(node{y[i],0});
        a[y[i]].push_back(node{x[i],0});
        if(find(x[i])==find(y[i])){
            puts("No");
            return 0;
        }
        fa[find(x[i])]=find(y[i]);
    }
    puts("Yes");
    for(int i=1;i<=n;i++){
        if(fa[i]==i)p.push_back(i);
    }
    for(int i=1;i<=n;i++)siz[i]=a[i].size();
    for(int i:p){
        if(a[i].size()){
            rt=i;
            dfs(i,0);
            print(i,0);
            return 0;
        }
    }
    return 0;
}

可以不管代码思路,就是看看为啥会加上注释那句就会T。。。
思路很抽象。。。

2024/12/29 21:03
加载中...