답안 #244554

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
244554 2020-07-04T09:37:06 Z tqbfjotld Pipes (CEOI15_pipes) C++14
30 / 100
532 ms 19276 KB
///lib code still allowed right
#include <vector>
#include <utility>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define MAXN 10005

int low[MAXN];
int order[MAXN];
int cur = 1;
pair<int,int> edgelist[2400005];
int root = 0;
int temp[MAXN];
int n,e;

///ensure no duplicate edges first though
void dfs(int node, int parent){
    order[node] = cur;
    cur++;
    low[node] = order[node];
    for (auto it = lower_bound(edgelist,edgelist+2*e,make_pair(node,-1)); it!=edgelist+2*e && (*it).first==node; it++){
        temp[(*it).second]++;
    }
    for (auto it = lower_bound(edgelist,edgelist+2*e,make_pair(node,-1)); it!=edgelist+2*e && (*it).first==node; it++){
        if (temp[(*it).second]==0) continue;
        temp[(*it).second]--;
        bool thing = false;
        if (temp[(*it).second]!=0) {
            thing = true;
            temp[(*it).second] = 0;
        }
        if (order[(*it).second]==-1){
            dfs((*it).second,thing?-1:node);
            if (low[node]==-1 || (low[(*it).second]!=-1 && low[(*it).second]<low[node])){
                low[node] = low[(*it).second];
            }
            if (node!=root){
                if (low[(*it).second]==-1 || low[(*it).second]>=order[node]){
                }
            }
            else{
            }
        }
        else if ((*it).second!=parent){
            if (low[node]==-1 || order[(*it).second]<low[node]) low[node] = order[(*it).second];
        }
    }
}
//ans is number of components after removing node (>1 if is articulation point)
//bridge break a component if it is removed
//HAVE NOT TESTED YET (but should be correct though)
inline bool isBridge(int a, int b){
    if (order[b]<order[a]) swap(a,b);
    return low[b]>order[a];
}



int main(){
    scanf("%d%d",&n,&e);
    for (int x = 0; x<e; x++){
        int a,b;
        scanf("%d%d",&a,&b);
        a--;b--;
        edgelist[x*2] = {a,b};
        edgelist[x*2+1] = {b,a};
    }
    sort(edgelist,edgelist+e*2);
    memset(low,-1,sizeof(low));
    memset(order,-1,sizeof(order));
    for (root = 0; root<n; root++){
        if (order[root]==-1) dfs(root,-1);
    }
    for (int x = 0; x<n; x++){
        //printf("%d: order: %d, low: %d\n",1+x,order[x],low[x]);
    }
    for (int i = 0; i<2*e; i++){
            int x = edgelist[i].first;
            int y = edgelist[i].second;
            if (y<x){
                if (isBridge(x,y)){
                    printf("%d %d\n",x+1,y+1);
                }
            }
    }

}



Compilation message

pipes.cpp: In function 'int main()':
pipes.cpp:63:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",&n,&e);
     ~~~~~^~~~~~~~~~~~~~
pipes.cpp:66:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&a,&b);
         ~~~~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 5 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 768 KB Output is correct
2 Correct 11 ms 640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 313 ms 9868 KB Output is correct
2 Correct 306 ms 9592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 532 ms 16756 KB Memory limit exceeded (if you are sure your verdict is not MLE, please contact us)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 360 ms 19212 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 335 ms 19192 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 345 ms 19192 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 346 ms 19240 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 355 ms 19276 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 351 ms 19160 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -