@laofang
2016-07-03T02:41:40.000000Z
字数 1263
阅读 757
c++
来源: http://www.cnblogs.com/cchun/archive/2012/08/18/2645077.html
#include <iostream>#include <vector>#include <cstdio>#include <algorithm>#include <utility>#include <cstring>using namespace std;typedef struct _node{int v, id, num;_node():num(0) {};}N;const int MAX = 10005;vector<N> vec[MAX];int dfn[MAX], low[MAX], step, id;int ans[MAX * 10], cnt;void addEdge(int u, int v){bool flag = false;for(unsigned i = 0; i < vec[u].size(); i++){if(vec[u][i].v == v){flag = true;vec[u][i].num++;for(unsigned j = 0; j < vec[v].size(); j++){if(vec[v][j].v == u){vec[v][j].num++;break;}}id++;break;}}if(flag == false){N tmp;tmp.v = v, tmp.id = id++;tmp.num = 1;vec[u].push_back(tmp);tmp.v = u;vec[v].push_back(tmp);}}void tarjan(int father, int n){dfn[n] = low[n] = ++step;for(unsigned i = 0; i < vec[n].size(); i++){int son = vec[n][i].v;if(dfn[son] == -1){tarjan(n, son);low[n] = min(low[n], low[son]);}else if(son != father)low[n] = min(low[n], dfn[son]);}if(dfn[n] == low[n]){int son = n;n = father;for(unsigned k = 0; k < vec[n].size(); k++){if(son == vec[n][k].v){if(vec[n][k].num == 1){ans[cnt++] = vec[n][k].id;}break;}}}}void init(){id = 1;step = cnt = 0;for(int i = 0; i < MAX; i++){vec[i].clear();dfn[i] = low[i] = -1;}}int main(void){int n, m;while(std::cin >> n >> m){init();for(int i = 0; i < m; i++){int u, v;std::cin >> u >> v;addEdge(u, v);}dfn[1] = low[1] = ++step;tarjan(1, 1);std::cout << cnt << std::endl;}return 0;}