关于一种特殊写法
查看原帖
关于一种特殊写法
554698
Zi_Gao楼主2023/7/30 09:16
#include<cstdio>
#include<algorithm>
#include<vector>
#include<stack>
// #define ONLINE_JUDGE
#define INPUT_DATA_TYPE int
#define OUTPUT_DATA_TYPE int
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){register char s[20];register int i=0;if(x<0){x=-x;putchar('-');}if(x==0){putchar('0');return;}while(x){s[i++]=x%10;x/=10;}while(i){putchar(s[--i]+'0');}return;}

struct EDGE{
    int v,id;
};

std::vector<EDGE> e[500010];
std::vector<int> edcc[500010];
std::stack<int> stack;

int dfn[500010],low[500010],cnt,tot;
char isEdcc[2000010],vis[500010];

void addEdge(int u,int v,int id){
    e[u].push_back(EDGE{v,id});
    return;
}

void tarjan(int u,int p){
    // print(u);putchar(' ');
    low[u]=dfn[u]=(dfn[p]+1);
    stack.push(u);
    for(auto edge:e[u])
        if(edge.v!=p){
            if(dfn[edge.v]&&edge.v!=p) low[u]=std::min(low[u],dfn[edge.v]);
            else{
                tarjan(edge.v,u);
                if(low[edge.v]>dfn[u]) isEdcc[edge.id]=1;
                low[u]=std::min(low[u],low[edge.v]);
            }
        }
    return;
}

void dfs(int u){
    vis[u]=1;
    edcc[cnt].push_back(u);
    for(auto edge:e[u])
        if(!vis[edge.v]&&!isEdcc[edge.id])
            dfs(edge.v);
}

int main(){
	#ifndef ONLINE_JUDGE
	freopen("name.in", "r", stdin);
	freopen("name.out", "w", stdout);
	#endif

    register int i,u,v;
    int n=read();
    int m=read();

    for(i=0;i<m;++i){
        u=read();
        v=read();
        if(u==v) continue;
        addEdge(u,v,i);
        addEdge(v,u,i);
    }

    for(i=1;i<=n;++i)
        if(!dfn[i])
            tarjan(i,i);

    for(i=1;i<=n;++i)
        if(!vis[i]){
            dfs(i);
            ++cnt;
        }
    
    print(cnt);putchar('\n');
    for(i=0;i<cnt;++i){
        print(edcc[i].size());putchar(' ');
        for(auto u:edcc[i]){
            print(u);putchar(' ');
        }
        putchar('\n');
    }

	#ifndef ONLINE_JUDGE
	fclose(stdin);
	fclose(stdout);
	#endif
    return 0;
}

这份代码中并没有记录来时的边,只传入了父亲,但是还是可以跑对,不知道有没有可以卡的方法。

2023/7/30 09:16
加载中...