P1656炸铁路

一、题目描述

  

 

 二、解题思路

  tarjan求割边模板题,用个答案数组存答案,求出来后排序就可以了。

三、代码实现

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int G[200][200];
 4 int low[200],dfn[200],t = 1;
 5 int root = 1;
 6 int m,n;
 7 vector <pair<int,int>> ans;
 8 void dfs(int cur,int father)
 9 {
10     low[cur] = t;
11     dfn[cur] = t;
12     t++;
13     for(int i = 1;i <= n;i++){
14         if(G[cur][i]){
15             if(dfn[i] == 0){
16                 dfs(i,cur);
17                 low[cur] = min(low[cur],low[i]);
18                 if(low[i] > dfn[cur])
19                     ans.emplace_back(make_pair(cur,i));
20             }
21             else if(i != father)
22                 low[cur] = min(dfn[i],low[cur]);
23         }
24     }
25     return;
26 }
27 int main()
28 {
29     int x,y;
30     cin >> n >> m;
31     for(int i = 1;i <= n;i++)
32         for(int j = 1;j <= n;j++)
33             G[i][j] = 0;
34     for(int i = 1;i <= m;i++){
35         cin >> x >> y;
36         G[x][y] = 1;
37         G[y][x] = 1;
38     }
39     dfs(1,root);
40     sort(ans.begin(),ans.end());
41     for(auto &u: ans)
42         cout << u.first << ' ' << u.second << endl;
43     return 0;
44 }
posted @ 2022-02-13 19:30  scannerkk  阅读(60)  评论(0)    收藏  举报