1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "sabotaz.h"
#include "message.h"
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n,m;
vector<int>G[200007];
int pop[200007], low[200007], d[200007], odw[200007];

void wczytaj()
{
    int a,b;
    for(long long i=0; i<m; i++)
    {
        a=(int)BridgeEndA(i);
        b=(int)BridgeEndB(i);
        if(a!=b)
        {
            G[a].push_back(b);
            G[b].push_back(a);
        }
    }
}

int l=0;

void mosty(int s)
{
    l++;
    d[s]=l;
    odw[s]=1;
    for(int i=0; i<G[s].size(); i++)
    {
        if(!odw[G[s][i]])
        {
            pop[G[s][i]]=s;
            mosty(G[s][i]);
        }
    }
    low[s]=d[s];
    for(int i=0; i<G[s].size(); i++)
    {
        if(pop[s]==G[s][i])
            continue;
        if(pop[G[s][i]]==s)
            low[s]=min(low[s],low[G[s][i]]);
        else
            low[s]=min(low[s],d[G[s][i]]);
    }
}

int main()
{
    n=NumberOfIsles();
    m=NumberOfBridges();
    wczytaj();
    for(int i=1; i<=n; i++)
        if(!odw[i])
            mosty(i);
    int licznik=0;
    for(int i=1; i<=n; i++)
        if(low[i]==d[i]&&pop[i]!=0)
            licznik++;
    if(MyNodeId()==0)
        cout<<licznik<<endl;


	return 0;
}