QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#582017#2517. Critical StructuresCSQ#AC ✓41ms19344kbC++232.6kb2024-09-22 15:00:212024-09-22 15:00:24

Judging History

你现在查看的是最新测评结果

  • [2024-09-22 15:00:24]
  • 评测
  • 测评结果:AC
  • 用时:41ms
  • 内存:19344kb
  • [2024-09-22 15:00:21]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

#define rep(i,a,b) for(int i=a;i<b;++i)
#define all(x) begin(x),end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
int bridge = 0,cut = 0;
vi num, st;
vector<vector<pii>> ed;
int Time;
int dfs(int at, int par, vector<vector<int>> &f){
    int me = num[at] = ++Time, e, y, top = me;
    for (auto pa : ed[at]) if (pa.second != par){
        tie(y, e) = pa;
        if (num[y]){
            top = min(top, num[y]);
            if (num[y] < me)
                st.push_back(e);
        }
        else {
            int si = sz(st);
            int up = dfs(y, e, f);
            top = min(top, up);
            if (up == me){
                st.push_back(e);
                f.push_back(vi(st.begin() + si, st.end()));
                st.resize(si);
            }   
            else if (up < me) st.push_back(e);
            else { bridge++;}
        }
    }
    return top;
}

int main()
{
    int t;
    cin>>t;
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);
    while(t--){
        bridge = cut = Time = 0;
        st.clear();
        num.clear();
        int n,m;
        cin>>n>>m;
        int eid = 0;
        ed.resize(n);
        for(int i=0;i<n;i++)ed[i].clear();
        for(int i=0;i<m;i++){
            int a,b;
            cin>>a>>b;
            a--;
            b--;
            ed[a].push_back({b,eid});
            ed[b].push_back({a,eid++});
        }
        vector<vector<int>>v;
        num.assign(sz(ed),0);
        for(int i=0;i<n;i++)if(!num[i])dfs(i,-1,v);

        int mx = 1;    
        int id = 0;
        vector<int>lab(m,-1);
        for(auto x:v){ 
            mx = max(mx,sz(x));
            for(int y:x)lab[y] = id;
            id++;
        }
        
        vector<int>seen(m,0);
        for(int i=0;i<n;i++){
            int cnt = 0;
            for(pii x:ed[i]){
                int c = lab[x.second];
                if(c == -1)cnt++;
                else{
                    if(!seen[c])cnt++;
                    seen[c] = 1;
                }
            }
            for(pii x:ed[i]){
                int c = lab[x.second];
                if(c == -1)continue;
                else seen[c] = 0;
            }
            if(cnt>1)cut++;
        }
        int comp = sz(v);
        comp += bridge;
        int g = gcd(comp,mx);
        comp/=g;
        mx/=g;
        cout<<cut<<" "<<bridge<<" "<<comp<<" "<<mx<<'\n';
        //cout<<"TES"<<'\n';
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3496kb

input:

1
6 6
1 2
2 3
3 4
4 5
5 6
6 1

output:

0 0 1 6

result:

ok single line: '0 0 1 6'

Test #2:

score: 0
Accepted
time: 0ms
memory: 3780kb

input:

1
6 7
1 2
2 3
3 1
4 5
5 6
6 4
1 4

output:

2 1 1 1

result:

ok single line: '2 1 1 1'

Test #3:

score: 0
Accepted
time: 41ms
memory: 19344kb

input:

10
6 6
1 2
2 3
3 4
4 5
5 6
6 1
5 4
1 2
2 3
3 4
4 5
5 7
1 2
1 3
3 4
4 5
5 3
1 4
1 5
13 16
1 2
1 6
1 3
1 7
3 7
4 6
4 5
5 6
5 7
7 8
8 9
7 10
10 11
12 13
10 12
10 13
10 11
1 2
2 3
2 4
3 5
4 5
4 6
6 7
7 8
6 8
8 9
8 10
3 3
1 2
2 3
3 1
44 66
1 5
1 12
1 33
2 27
2 31
2 32
2 35
2 37
2 40
3 6
3 30
3 44
4 20
4 ...

output:

0 0 1 6
3 4 4 1
1 1 1 3
4 5 7 8
4 4 3 2
0 0 1 3
8 9 10 57
0 0 1 499500
2 2 3 1777
108 112 113 1531

result:

ok 10 lines