QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#189892#873. Königsberg BridgesKKT89AC ✓668ms224692kbC++174.4kb2023-09-28 01:19:552023-09-28 01:19:56

Judging History

This is the latest submission verdict.

  • [2023-09-28 01:19:56]
  • Judged
  • Verdict: AC
  • Time: 668ms
  • Memory: 224692kb
  • [2023-09-28 01:19:55]
  • Submitted

answer

#pragma GCC optimize("Ofast")
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <cstdio>
#include <ctime>
#include <assert.h>
#include <chrono>
#include <random>
#include <numeric>
#include <set>
#include <deque>
#include <stack>
#include <sstream>
#include <utility>
#include <cstring>
using namespace std;
typedef long long int ll;
typedef unsigned long long ull;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) {
    return (ull)rng() % B;
}

struct UnionFind{
    vector<int> par,num;
    UnionFind(int n):par(n),num(n,1){
        iota(par.begin(),par.end(),0);  //include<numeric>
    }
    int find(int v){
        return (par[v]==v)?v:(par[v]=find(par[v]));
    }
    void unite(int u,int v){
        u=find(u),v=find(v);
        if(u==v)return;
        if(num[u]<num[v])swap(u,v);
        num[u]+=num[v];
        par[v]=u;
    }
    bool same(int u,int v){
        return find(u) == find(v);
    }
    int size(int v){
        return num[find(v)];
    }
};

int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int n,m; cin >> n >> m;
    vector<vector<int>> g(n);
    for(int i=0;i<m;i++){
        int x,y; cin >> x >> y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    vector<int> used(n);
    vector<int> imos_v(n);
    vector<int> deg(n);
    int sz = 0;
    UnionFind uf(n);
    vector<int> pa(n,-1);
    vector<vector<int>> G(n); // 縮約後のグラフ
    int res = 0;
    for(int i=0;i<n;i++){
        if(!used[i]){
            sz++;
            used[i]=1;
            vector<int> v;
            auto dfs=[&](auto dfs,int s,int p)->void{
                bool par = false;
                v.push_back(s);
                for(int t:g[s]){
                    if(t==p and !par){
                        par = true;
                    }
                    else if(!used[t]){
                        pa[t] = s;
                        deg[s]++;
                        used[t]=used[s]+1;
                        dfs(dfs,t,s);
                    }
                    else if(used[s]<used[t])continue;
                    else{
                        imos_v[t]--;
                        imos_v[s]++;
                    }
                }
            };
            dfs(dfs,i,-1);
            queue<int> q;
            for(int i:v){
                if(deg[i] == 0){
                    q.push(i);
                }
            }
            while(q.size()){
                int s = q.front(); q.pop();
                if(pa[s] != -1){
                    if(imos_v[s] != 0){
                        uf.unite(s, pa[s]);
                    }
                    imos_v[pa[s]] += imos_v[s];
                    deg[pa[s]]--;
                    if(deg[pa[s]] == 0){
                        q.push(pa[s]);
                    }
                }
            }
            for(int i:v){
                if(pa[i] != -1){
                    if(!uf.same(pa[i],i)){
                        int s = uf.find(i);
                        int t = uf.find(pa[i]);
                        G[s].push_back(t);
                        G[t].push_back(s);
                    }
                }
            }
        }
    }
    vector<int> d(n,-1);
    for(int i=0;i<n;i++){
        if(d[i] == -1){
            vector<int> v;
            queue<int> q;
            q.push(i);
            d[i] = 0;
            while(q.size()){
                int s = q.front(); q.pop();
                v.push_back(s);
                for(int t:G[s]){
                    if(d[t] == -1){
                        d[t] = d[s]+1;
                        q.push(t);
                    }
                }
            }
            int mx = i;
            for(int &j:v){
                if(d[mx] < d[j])mx = j;
            }
            for(int &j:v){
                d[j] = -1;
            }
            d[mx] = 0;
            q.push(mx);
            while(q.size()){
                int s = q.front(); q.pop();
                v.push_back(s);
                for(int t:G[s]){
                    if(d[t] == -1){
                        d[t] = d[s]+1;
                        q.push(t);
                    }
                }
                mx = d[s];
            }
            res += mx;
        }
    }
    cout << res + sz - 1 << endl;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3532kb

input:

4 3
0 1
1 2
2 0

output:

1

result:

ok 1 number(s): "1"

Test #2:

score: 0
Accepted
time: 1ms
memory: 3464kb

input:

4 2
0 1
1 2

output:

3

result:

ok 1 number(s): "3"

Test #3:

score: 0
Accepted
time: 315ms
memory: 64044kb

input:

266912 867557
0 31522
0 174162
0 4209
1 58647
1 5722
1 24762
1 258525
1 148028
1 72989
1 170812
1 260494
1 86533
1 212481
2 143457
2 47080
2 72841
2 113512
2 64754
2 231454
3 220536
3 97144
3 183508
3 177546
3 149060
3 140197
3 87427
3 169096
4 132318
4 67337
4 23014
4 34254
4 11851
4 12558
4 49756
...

output:

380

result:

ok 1 number(s): "380"

Test #4:

score: 0
Accepted
time: 196ms
memory: 34044kb

input:

92162 903746
0 78341
0 30101
0 86910
0 71281
0 66038
0 58991
0 27261
0 12794
0 44202
0 27063
0 8617
0 1463
0 48097
0 24219
0 51184
0 42335
0 20179
0 79826
0 29670
0 121
0 80004
0 22547
0 54055
0 80647
0 20967
0 7230
0 20852
0 67815
0 63277
0 61650
1 24614
1 60787
1 78668
1 73795
1 36239
1 90410
1 71...

output:

0

result:

ok 1 number(s): "0"

Test #5:

score: 0
Accepted
time: 133ms
memory: 73436kb

input:

946158 0

output:

946157

result:

ok 1 number(s): "946157"

Test #6:

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

input:

717331 671
277 661428
388 696195
2457 576086
2926 555369
2959 191594
4142 432000
4312 309773
4858 471165
4886 682026
5569 403920
5620 470329
6027 546706
6049 179350
6596 471181
6792 416677
7466 628061
7648 378219
7650 560432
7660 55602
7973 18975
8076 121285
8123 172484
8325 202734
8570 501604
8904 ...

output:

717330

result:

ok 1 number(s): "717330"

Test #7:

score: 0
Accepted
time: 668ms
memory: 159516kb

input:

1000000 1000000
0 168067
0 116972
1 776624
1 327773
1 145060
2 14506
2 181311
2 431159
2 652430
3 173884
4 394795
4 172555
5 494172
5 945490
7 595196
7 593371
7 358866
8 860794
9 598459
10 505821
10 41753
10 880384
11 74592
11 715116
11 659129
12 977041
12 807365
12 952349
13 844571
13 154379
15 185...

output:

200542

result:

ok 1 number(s): "200542"

Test #8:

score: 0
Accepted
time: 660ms
memory: 158696kb

input:

1000000 999999
1 412610
2 712889
2 254970
2 803563
3 678225
6 294090
6 662272
7 593625
7 444343
7 348966
7 168525
8 273575
8 486405
9 644268
9 321394
9 223587
11 719799
11 547678
11 742807
11 332536
12 260338
13 995176
14 234723
14 785909
15 406384
15 636469
16 388652
16 528991
17 741822
18 78605
19...

output:

201011

result:

ok 1 number(s): "201011"

Test #9:

score: 0
Accepted
time: 136ms
memory: 78600kb

input:

1000000 8936
62 728171
75 810657
186 344905
204 186449
253 441452
271 371090
292 948549
306 595932
315 901739
390 621170
396 287021
473 437138
494 530383
513 588605
527 23089
531 768891
567 189841
600 335182
693 723411
731 521138
745 696157
877 168905
925 902019
997 668395
1025 968824
1152 56167
119...

output:

999999

result:

ok 1 number(s): "999999"

Test #10:

score: 0
Accepted
time: 181ms
memory: 159860kb

input:

688670 688669
0 1
1 2
1 3
1 4
3 5
4 10
5 6
6 7
7 8
8 9
9 11
9 12
11 13
11 14
14 15
14 17
15 16
16 18
16 19
18 24
18 26
19 20
19 22
20 21
21 23
21 27
23 25
23 28
25 29
25 30
29 31
29 36
31 32
31 34
32 33
33 35
34 39
35 37
37 38
37 41
38 40
40 42
40 43
42 44
44 45
44 48
45 46
46 47
46 49
46 51
47 50
4...

output:

398561

result:

ok 1 number(s): "398561"

Test #11:

score: 0
Accepted
time: 250ms
memory: 224692kb

input:

1000000 999999
0 1
0 2
1 3
1 7
2 5
3 4
4 6
6 8
7 9
8 10
8 11
8 12
12 13
13 14
14 15
15 16
16 17
16 18
16 19
17 22
18 20
20 21
21 23
23 24
24 25
25 26
25 27
25 28
26 31
27 29
29 30
31 32
32 33
32 40
33 34
34 35
34 39
35 36
36 37
37 38
38 41
41 42
41 43
42 44
44 45
44 46
45 47
47 48
48 49
48 51
49 50
...

output:

578343

result:

ok 1 number(s): "578343"