#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int M = 1005;
struct node {
int to;
int next;
}num[M*3];
stack<int>s;
int head[M];
int ins[M];
int dfn[M];
int low[M];
int sccf[M];
int du[M];
int n, m;
int index, scc;
int e ;
void init() {
index = 1;
scc = 0;
memset(head, -1, sizeof(head));
memset(ins, 0, sizeof(ins));
memset(low, 0, sizeof(low));
memset(sccf, 0, sizeof(sccf));
memset(du, 0, sizeof(du));
memset(dfn, 0, sizeof(dfn));
}
void add(int a, int b) {
num[e].to = b;
num[e].next = head[a];
head[a] = e++;
}
int getqiaoshu() {
// printf("d %d\n", scc);
int v;
for(int u = 1; u <= n; u++) {
for(int k = head[u]; k != -1; k = num[k].next) {
v = num[k].to;
if(low[u] != low[v]) {
du[low[u]]++;
}
}
}
int cont = 0;
for(int i = 1; i <= n; i++) {
if(du[i] == 1) {
cont++;
}
}
return (cont + 1)/2;
}
void Tanjian(int u, int p) {
int v;
low[u] = dfn[u] = index++;
ins[u] = 1;
s.push(u);
for(int k = head[u]; k != -1; k = num[k].next) {
v = num[k].to;
if(v == p) // 防止 a ->b 和 b -> a
continue;
if(!dfn[v]) {
Tanjian(v, u);
low[u] = min(low[v], low[u]);
}
else if(ins[v] == 1) {
low[u] = min(low[v], low[u]);
}
}
// ins[v] = 2;
/*if(low[u] == dfn[u]) {
scc++;
do {
v = s.top();
s.pop();
sccf[v] = scc;
ins[v] = 0;
}while(v != u);
}*/
}
int main()
{
int q = 1;
int a, b;
while(scanf("%d%d", &n, &m) != EOF) {
// printf("Sample Input %d\n", q++);
init();
e = 0;
for(int i = 1; i <= m; i++) {
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
for(int i = 1; i <= n; i++) {
if(!dfn[i]) {
Tanjian(i, i);
}
}
int ans = getqiaoshu();
printf("%d\n", ans);
}
return 0;
}
poj3352 Road Construction
最新推荐文章于 2020-08-18 16:14:20 发布