Cod sursa(job #2223213)

Utilizator Laza_AndreiLazarescu Andrei Vlad Laza_Andrei Data 19 iulie 2018 13:09:48
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

const int NMAX=100000;

vector <int> G[NMAX];

int dfsRoot,rootChildren;
int artNr=0;

int idx[NMAX],low[NMAX],parent[NMAX];
bool ap[NMAX];

int g=0;

void dfs(int u){
    ++g;
    idx[u]=low[u]=g;
    for(int i=0; i<G[u].size(); ++i){
        int v=G[u][i];
        if(idx[v]==0){
            parent[v]=u;
            if(u==dfsRoot)
                ++rootChildren;
            dfs(v);
            if(low[v]>=idx[u])
                ap[u]=1;
            low[u]=min(low[v],low[u]);
        }
        else{
            if(v!=parent[u])
            low[u]=min(low[u],idx[v]);
        }
    }
}

int main()
{
    freopen("pamant.in","r",stdin);
    freopen("pamant.out","w",stdout);
    int n,m;
    int u,v;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
        parent[i]=-1;
    for(int i=1;i<=m;++i){
        scanf("%d%d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    int convex=0;
    int convexValues[NMAX];
    for(int i=1;i<=n;++i)
        if(idx[i]==0){
            ++convex;
            convexValues[convex]=i;
            dfs(i);
            dfsRoot=i;
            rootChildren=0;
            ap[i]=(rootChildren>1);
        }
    printf("%d\n",convex);
    for(int i=1;i<=convex;++i)
        printf("%d ",convexValues[i]);
    printf("\n");
    for(int i=1;i<=n;++i)
        if(ap[i]==1)
            ++artNr;
    printf("%d\n",artNr);
    for(int i=1;i<=n;++i)
        if(ap[i]==1)
            printf("%d ",i);
    return 0;
}