Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <vector>
- using namespace std;
- vector<int> ans;
- vector<int> edge[5000], br[5000];
- int timer = 0, tin[5000], up[5000], c[5000], bright[5001];
- bool used[5000], used1[100000];
- void dfs (int v, int s, int p = -1) {
- used[v] = 1;
- tin[v] = ++timer;
- up[v] = timer;
- for (int i = 0; i < edge[v].size(); i++) {
- int u = edge[v][i];
- if (u != p) {
- if (tin[u]) {
- up[v] = min(up[v], tin[u]);
- } else {
- dfs(u, i, v);
- up[v] = min(up[v], up[u]);
- }
- }
- }
- if (p != -1 && up[v] == tin[v]) {
- used1[br[p][s]] = 1;
- }
- }
- void dfs1(int v, int color) {
- used[v] = true;
- c[v] = color;
- for (int i = 0; i < edge[v].size(); i++) {
- int u = edge[v][i];
- if (used1[br[v][i]] && (c[u] != 0)) {
- bright[color] += 1;
- bright[c[u]] += 1;
- } else if (!used1[br[v][i]] && !used[u])
- dfs1(u, color);
- }
- }
- int main()
- {
- int n, m, a, b;
- cin >> n >> m;
- for (int i = 0; i < m; i++) {
- cin >> a >> b;
- --a;
- --b;
- edge[a].push_back(b);
- edge[b].push_back(a);
- br[a].push_back(i);
- br[b].push_back(i);
- }
- for (int i = 0; i < n; i++)
- if (!used[i])
- dfs(i, 0);
- for (int i = 0; i < n; i++)
- used[i] = 0;
- for (int i = 0; i < n; i++)
- if (!used[i])
- dfs1(i, i + 1);
- int cnt = 0;
- for (int i = 1; i < n + 1; i++)
- cnt += (bright[i] == 1);
- cout << cnt / 2 + cnt % 2;
- /*for (int i = 0; i < n; i++)
- cout << c[i] << ' ';
- cout << endl;
- for (int i = 0; i < n + 1; i++)
- cout << bright[i] << ' ';
- cout << endl;*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement