Cod sursa(job #2456335)

Utilizator Coroian_DavidCoroian David Coroian_David Data 14 septembrie 2019 10:52:39
Problema Componente tare conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>

#define MAX_N 100000
#define MAX_M 300000

using namespace std;

struct muchie
{
    int a, b, c, i;
};

muchie v[MAX_M + 1];

vector <pair<int, int>> rez;

vector <int> g[MAX_N + 1];

void add(int a, int b)
{
    g[a].push_back(b);
}

int ctc;
int idx[MAX_N + 1];
int d[MAX_N + 1];
int comp[MAX_N + 1];
bool on[MAX_N + 1];

int stkLen;
int stk[MAX_N + 1];

bool viz[MAX_N + 1];

int n, m;
int s, dd;

void readFile()
{
    ifstream f("tarnacop.in");

    f >> n >> m >> s >> dd;
    for(int i = 1; i <= m; i ++)
    {
        int a, b, c, ii;
        f >> a >> b >> c >> ii;
        v[i] = {a, b, c, ii};

        if(ii > 0)
            add(b, a);

        if(c > ii)
            add(a, b);
    }

    f.close();
}

int depth;

void dfs(int a)
{
    depth ++;
    idx[a] = d[a] = depth;

    viz[a] = 1;
    stk[++ stkLen] = a;
    on[a] = 1;

    for(auto u : g[a])
    {
        if(viz[u] == 0)
        {
            dfs(u);
            d[a] = min(d[a], d[u]);
        }

        else
            if(on[u] == 1)
                d[a] = min(d[a], d[u]);
    }

    if(d[a] == idx[a])
    {
        ctc ++;
        int cr = 0;
        do
        {
            cr = stk[stkLen];
            comp[cr] = ctc;
            on[cr] = 0;
            stkLen --;
        }
        while(cr != a);
    }
}

void solve()
{
    for(int i = 1; i <= n; i ++)
    {
        if(viz[i] == 0)
            dfs(i);
    }

    for(int i = 1; i <= m; i ++)
    {
        if(v[i].i > 0 && v[i].i == v[i].c && !(comp[v[i].a] == comp[v[i].b]/* && comp[v[i].b] == comp[dd]*/))
            rez.push_back({v[i].a, v[i].b});
    }

    sort(rez.begin(), rez.end());
}

void printFile()
{
    ofstream g("tarnacop.out");

    g << rez.size() << "\n";
    for(int i = 0; i < rez.size(); i ++)
        g << rez[i].first << " " << rez[i].second << "\n";

    g.close();
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}