1. 程式人生 > 實用技巧 >D 華華和月月逛公園 (割邊)

D 華華和月月逛公園 (割邊)

割邊裸題

#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; }