炸铁路

Posted 66dzb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了炸铁路相关的知识,希望对你有一定的参考价值。

[Time Gate]

https://www.luogu.org/problemnew/show/P1656

【解题思路】

割点+桥模板题

关键在于排序用下标排序记录

【code】

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; 
struct Node 
    int s; 
    int t;
    int nxt; 
a[1000005];
inline int Min(int a,int b)
    return a<b?a:b;

int n,m,cnt,tot; 
int dfn[1000005],low[1000005],head[1000005],p[1000005]; 
inline void Add(int u,int v) a[++cnt].s=u; a[cnt].t=v; a[cnt].nxt=head[u]; head[u]=cnt; return ;  
inline void Tarjan(int u,int fa) 
     dfn[u]=low[u]=++cnt; 
     for(register int i=head[u];i;i=a[i].nxt) 
         int v=a[i].t; 
        if(!dfn[v])
             Tarjan(v,u); 
             low[u]=Min(low[u],low[v]);
              if(dfn[u]<low[v])p[++tot]=i; 
         
      else if(v!=fa) low[u]=Min(low[u],dfn[v]);
         
 
inline bool cmp(int x,int y) 
    if(a[x].s==a[y].s)return a[x].t<a[y].t; 
    return a[x].s<a[y].s;

int main() 
    scanf("%d%d",&n,&m); 
    for(register int i=1;i<=m;i++) 
        int a,b;
        scanf("%d%d",&a,&b); 
        Add(a,b); 
        Add(b,a); 
     
    for(register int i=1;i<=n;i++)
         if(!dfn[i])Tarjan(i,0); 
    sort(p+1,p+tot+1,cmp);
    for(register int i=1;i<=tot;i++) 
        printf("%d %d\n",a[p[i]].s,a[p[i]].t); 
    return 0;

 

以上是关于炸铁路的主要内容,如果未能解决你的问题,请参考以下文章

炸铁路

洛谷 P1656 炸铁路

洛谷P1656 炸铁路

[Luogu] 炸铁路 | Tarjan 割边

炸铁路

炸铁路