답안 #154722

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
154722 2019-09-24T07:57:18 Z nicolaalexandra Pipes (CEOI15_pipes) C++14
90 / 100
5000 ms 13020 KB
#include <iostream>
#include <vector>
#define DIM 100002
using namespace std;
int t[DIM],t2[DIM],viz[DIM],low[DIM],niv[DIM];
vector <int> L[DIM];
int n,m,i,j,x,y,idx;
inline int get_rad (int x){
    int nr = x;
    while (t[x] > 0)
        x = t[x];
    while (t[nr] > 0){
        int aux = t[nr];
        t[nr] = x;
        nr = aux;
    }
    return x;
}
inline int get_rad2 (int x){
    int nr = x;
    while (t2[x] > 0)
        x = t2[x];
    while (t2[nr] > 0){
        int aux = t2[nr];
        t2[nr] = x;
        nr = aux;
    }
    return x;
}
void dfs(int nod, int tata){
    niv[nod] = low[nod] = ++idx;
    for(int i=0;i<L[nod].size();++i){
        int vecin = L[nod][i];
        if (vecin == tata)
            continue;
        if (niv[vecin])
            low[nod] = min (low[nod],niv[vecin]);
        else {
            dfs (vecin, nod);
            low[nod] = min (low[nod],low[vecin]);
            if (low[vecin] > niv[nod] && get_rad2(nod) != get_rad2(vecin))
                cout<<nod<<" "<<vecin<<"\n";
        }}}

int main (){

    cin>>n>>m;
    for (i=1;i<=n;++i)
        t[i] = t2[i] = -1;

    for (i=1;i<=m;++i){
        cin>>x>>y;
        int rx = get_rad (x), ry = get_rad (y);
        if (rx != ry){
            L[x].push_back(y);
            L[y].push_back(x);
            if (t[rx] < t[ry]){
                t[rx] += t[ry];
                t[ry] = rx;
            } else {
                t[ry] += t[rx];
                t[rx] = ry;
            }
        } else {
            /// nodurile se alfa deja in aceeasi multime si toate muchiile
            /// de pe drumul de la x la y NU pot fi critice
            /// oare merge daca fac din nou paduri pt nodurile astea?
            int rx2 = get_rad2 (x), ry2 = get_rad2 (y);
            if (rx2 != ry2){
                L[x].push_back(y); /// astea ar fi muchiile de intoarcere pt biconexe
                L[y].push_back(x);
                if (t2[rx2] < t2[ry2]){
                    t2[rx2] += t2[ry2];
                    t2[ry2] = rx2;
                } else {
                    t2[ry2] += t2[rx2];
                    t2[rx2] = ry2;
                }}}}
    for (i=1;i<=n;++i)
        if (!niv[i])
            dfs (i,0);


    return 0;
}

Compilation message

pipes.cpp: In function 'void dfs(int, int)':
pipes.cpp:32:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<L[nod].size();++i){
                 ~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 2680 KB Output is correct
2 Correct 4 ms 2680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 3192 KB Output is correct
2 Correct 16 ms 2908 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 502 ms 3052 KB Output is correct
2 Correct 495 ms 2888 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 907 ms 3704 KB Output is correct
2 Correct 1032 ms 3304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1429 ms 5144 KB Output is correct
2 Correct 1236 ms 5172 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1885 ms 9928 KB Output is correct
2 Correct 1653 ms 7132 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2937 ms 11052 KB Output is correct
2 Correct 2929 ms 8828 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3921 ms 13004 KB Output is correct
2 Correct 3777 ms 8920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4926 ms 13020 KB Output is correct
2 Correct 4708 ms 8920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5011 ms 7244 KB Time limit exceeded
2 Halted 0 ms 0 KB -