D 華華和月月逛公園 (割邊)
阿新 • • 發佈:2020-07-12
割邊裸題
#include<bits/stdc++.h> using namespace std; #define pi acos(-1) #define mod 80112002 #define ll long long #define ull unsigned long long #define mem(a) memset(a,0,sizeof(a)) #define cio ios::sync_with_stdio(false); vector<int>e[100010]; // 建圖 int dfn[100010]; // 時間戳 int low[100010]; // 追溯值(不經過父節點所能到的最小節點)int n, m; int cnt; // 割邊數量 int step; // 搜尋訪問順序 void tarjan(int x, int y) { dfn[x] = low[x] = ++step; // 初始化時間戳以及追溯值 for(int i = 0; i < e[x].size(); i++){ // 遍歷相鄰邊 int p = e[x][i]; // 節點p if(!dfn[p]){ // 未訪問過節點p tarjan(p,x); // 繼續搜尋 low[x] = min(low[x],low[p]); // 更新追溯值if(low[p]>dfn[x]) cnt++; // 判斷是否為橋 }else if(p!=y){ // 訪問過的點並且不是x的父節點(y) low[x] = min(low[x],dfn[p]); } } } int main() { cnt = 0; step = 0; // 初始化訪問為0 cin >> n >> m; int x, y; for(int i = 1; i <= m; i++){ cin >> x >> y; e[x].push_back(y);// 無向圖雙向邊 e[y].push_back(x); } tarjan(1,0); // dfs搜尋 cout << m-cnt << endl; return 0; }