总司令分求助www
查看原帖
总司令分求助www
906856
A2_Zenith楼主2023/8/18 19:47

45pts。

感觉不需要改的边没什么用就没加。

除此之外好像没啥错的地方。

玄关。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdlib>
#include<iomanip>
#include<map>
#define int long long
#define double long double
#define lc(p) p<<1
#define rc(p) p<<1|1
#define pii pair<int,int>
using namespace std;
struct edge{
    int v;
    int rev;
    bool exs;
};

int d[100007];
int del[100007];
bool vis[100007];
int reftop[100007];
vector<edge> e[100007];
stack<int> ans[100007];
int tpp=0;
void dfs(int now){
    if(vis[now])return;
    vis[now]=true;
    for(int &i=del[now];i<e[now].size();){
        if(e[now][i].exs){
            edge t=e[now][i];
            e[now][i].exs=0;
            e[t.v][t.rev].exs=0;
            i++;
            dfs(t.v);
        }
        else i++;
    }
    ans[tpp].push(now);
}
int n,m;
signed main(){ios::sync_with_stdio(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v,b1,b2;
        cin>>u>>v>>b1>>b2;
        if(b1!=b2){
            e[u].push_back({v,0,1});
            e[v].push_back({u,0,1});
            d[u]++;
            d[v]++;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<e[i].size();i++){
            e[i][j].rev=reftop[e[i][j].v];
            reftop[e[i][j].v]++;
        }
    }
    for(int i=1;i<=n;i++){
        if(d[i]&1){
            cout<<"NIE"<<endl;
            return 0;
        }
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            tpp++;
            dfs(i);
        }
    }
    cout<<tpp<<endl;
    for(int i=1;i<=tpp;i++){
        cout<<ans[i].size()<<" ";
        int fir=ans[i].top();
        while(!ans[i].empty()){
            cout<<ans[i].top()<<" ";
            ans[i].pop();
        }
        cout<<fir<<endl;
    }
}
2023/8/18 19:47
加载中...