[Luogu] 炸铁路 | Tarjan 割边

简介: 题目描述A 国派出将军uim,对 B 国进行战略性措施,以解救涂炭的生灵。B 国有 n个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。uim 发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为 key road。uim 为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。然而,只有一发炮弹(A 国国会不给钱了)。所以,他能轰炸哪一条铁路呢?

题目描述


A 国派出将军uim,对 B 国进行战略性措施,以解救涂炭的生灵。


B 国有 n个城市,这些城市以铁路相连。任意两个城市都可以通过铁路直接或者间接到达。


uim 发现有些铁路被毁坏之后,某两个城市无法互相通过铁路到达。这样的铁路就被称为 key road。


uim 为了尽快使该国的物流系统瘫痪,希望炸毁铁路,以达到存在某两个城市无法互相通过铁路到达的效果。


然而,只有一发炮弹(A 国国会不给钱了)。所以,他能轰炸哪一条铁路呢?


输入格式


第一行 (1≤n≤150,1 ≤ m ≤ 5000 ),分别表示有 n  个城市,总共 m 条铁路。


以下 m 行,每行两个整数 a , b ,表示城市 a  和城市 b  之间有铁路直接连接。


输出格式


输出有若干行。


每行包含两个数字 a , b ( a < b ),表示 < a , b >  是 key road。


请注意:输出时,所有的数对 < a , b > 必须按照 a 从小到大排序输出;如果a 相同,则根据 b  从小到大排序。


输入输出样例


输入 #1复制


6 6
1 2
2 3
2 4
3 5
4 5
5 6


输出 #1复制


1 2
5 6


题意:


题中所述的key Road即为割边

题意比较裸

对于图的连通行这一块,就可以通过 Tarjan来求出割边来进行排序输出边即可

割边:去掉某一条边之后,图中强连通分量的个数增加,这样的边叫做割边,这样的边在求解过程中满足 low[to]>dfn[u]

所以说在求解的过程中,将满足条件的边进行存储即可


struct node{
  int to,nex,id;
}e[maxn];
int n,m;
int cnt,head[maxn];
typedef pair<int,int> PII;
void init(){
  cnt = 0;
  for(int i=1;i<=n;i++) head[i] = -1;
}
void add(int u,int v,int id){
  e[cnt].to = v;
  e[cnt].nex = head[u];
  e[cnt].id = id;
  head[u] = cnt ++;
}
int tim = 0;
int dfn[maxn],low[maxn];
vector<PII> edge;
vector<PII> ans;
void Tarjan(int u,int father){
  dfn[u] = low[u] = ++ tim;
  for(int i=head[u];~i;i=e[i].nex){
    int to = e[i].to;
    if(!dfn[to]) {
      Tarjan(to,u);
      low[u] = min(low[u],low[to]);
      if(low[to] > dfn[u]){
        ans.push_back(edge[e[i].id-1]);
      }
    }else if(to != father){
      low[u] = min(low[u],dfn[to]);
    }
  }
}
int main() {
  n = read,m = read;
  init();
  for(int i=1;i<=m;i++){
    int u = read,v = read;
    add(u,v,i);
    add(v,u,i);
    edge.push_back({min(u,v),max(u,v)});
  }
  Tarjan(1,0);
  sort(ans.begin(),ans.end(),[](PII a,PII b){
    if(a.first != b.first) return a.first < b.first;
    else return a.second < b.second;
  });
  for(int i=0;i<ans.size();i++){
    printf("%d %d\n",ans[i].first,ans[i].second);
  }
  return 0;
}
/**
**/




目录
相关文章
|
10月前
1314:【例3.6】过河卒(Noip2002)
1314:【例3.6】过河卒(Noip2002)
蓝桥 全球变暖 (bfs)
蓝桥 全球变暖 (bfs)
|
9月前
|
算法 安全 定位技术
【BFS】海上救援任务
【BFS】海上救援任务(c++基础算法)
67 0
|
11月前
|
定位技术
DFS:王子救公主
DFS:王子救公主
|
12月前
luogu P1993 小K的农场(差分约束系统)
luogu P1993 小K的农场(差分约束系统)
44 0
|
12月前
|
存储 算法 C++
C++/PTA 神坛
在古老的迈瑞城,巍然屹立着 n 块神石。长老们商议,选取 3 块神石围成一个神坛。因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好。特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面积为 0.000。
96 0
|
12月前
|
存储 算法 程序员
C++/PTA 地铁一日游
森森喜欢坐地铁。这个假期,他终于来到了传说中的地铁之城——魔都,打算好好过一把坐地铁的瘾!
131 0
|
大数据 网络架构 索引
Leecode134加油站打卡
Leecode134加油站打卡
72 0
Leecode134加油站打卡
|
机器人
UPC—— 最勇敢的机器人(并查集+分组背包)
UPC—— 最勇敢的机器人(并查集+分组背包)
60 0
蓝桥杯 砝码称重
蓝桥杯 砝码称重
47 0