• 洛谷P1656 炸铁路


    题目描述

    因为某国被某红色政权残酷的高压暴力统治。美国派出将军uim,对该国进行战略性措施,以解救涂炭的生灵。

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

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

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

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

    输入输出格式

    输入格式:

    第一行n,m(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

    裸tarjan求桥

    又一次把u和v写混了,简直是咸鱼界的耻辱。

     1 /*by SilverN*/
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 using namespace std;
     8 const int mxn=350;
     9 int read(){
    10     int x=0,f=1;char ch=getchar();
    11     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 struct edge{
    16     int v,nxt;
    17 }e[12010];
    18 int hd[mxn],mct=0;
    19 void add_edge(int u,int v){
    20     e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;
    21     return;
    22 }
    23 int n,m;
    24 int dfn[mxn],low[mxn],dtime=0;
    25 struct node{
    26     int a,b;
    27 }ans[mxn];
    28 bool operator < (node a,node b){
    29     if(a.a==b.a)return a.b<b.b;
    30     return a.a<b.a;
    31 }
    32 int cnt=0;
    33 void DFS(int u,int fa){
    34     low[u]=dfn[u]=++dtime;
    35     for(int i=hd[u];i;i=e[i].nxt){
    36         int v=e[i].v;
    37         if(v==fa)continue;
    38         if(!dfn[v]){
    39             DFS(v,u);
    40             low[u]=min(low[u],low[v]);
    41             if(low[v]>dfn[u]){
    42                 ans[++cnt].a=u;
    43                 ans[cnt].b=v;
    44                 if(ans[cnt].a>ans[cnt].b)swap(ans[cnt].a,ans[cnt].b);
    45             }
    46         }else low[u]=min(low[u],dfn[v]);
    47     }
    48     return;
    49 }
    50 int main(){
    51     n=read();m=read();
    52     int i,j,u,v;
    53     for(i=1;i<=m;i++){
    54         u=read();v=read();
    55         add_edge(u,v);
    56         add_edge(v,u);
    57     }
    58     for(i=1;i<=n;i++){
    59         if(!dfn[i])DFS(i,0);
    60     }
    61     sort(ans+1,ans+cnt+1);
    62     for(i=1;i<=cnt;i++){
    63         printf("%d %d
    ",ans[i].a,ans[i].b);
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    Java的快速失败和安全失败
    Java RMI与RPC的区别
    Java动态代理之JDK实现和CGlib实现(简单易懂)
    JVM——字节码增强技术简介
    Linux内存分配机制之伙伴系统和SLAB
    操作系统动态内存管理——malloc和free的工作机制
    Java中的Map
    Java的PriorityQueue
    Java中的List
    Java中的Set
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6055993.html
Copyright © 2020-2023  润新知