P1656 炸铁路


//
//  main.cpp
//  P1656 炸铁路
//
//  Created by CONIO on 2020/12/14.
//

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
#include <stack>
using namespace std;
const int N=155,M=5005;
int DFN[N],LOW[N],COL[N],ts,cc,n,m,cur,vis[N];
bool in[N];
stack<int> S;

struct Edge
{
    int u,v;
    Edge(){}
    Edge(int z,int x)
    {
        if(z>x)swap(z,x);
        u=z;
        v=x;
    }
    bool operator <(const Edge &E)const
    {
        if(this->u==E.u)
        {
            return this->v<E.v;
        }
        return this->u<E.u;
    }
};

struct Node
{
    int v,ind;
    Node(int x,int y)
    {
        v=x;
        ind=y;
    }
};

vector<Node>G[N];

void dfs(int u)
{
    vis[u]=1;
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i].v;
        int ind=G[u][i].ind;
        if(ind == cur)continue;
        if(!vis[v])dfs(v);
    }
}


inline int read()
{
    char c = getchar(); int x = 0;
    for (; !isdigit(c); c = getchar());
    for (; isdigit(c); c = getchar())
        x = x * 10 + c - '0';
    return x;
}

Edge e[M];

bool cmp(Edge &i,Edge &j)
{
    if(i.u==j.u)return i.v<j.v;
    return i.u<j.u;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u=read();
        int v=read();
        G[u].push_back(Node(v,i));
        G[v].push_back(Node(u,i));
        e[i]=Edge(u,v);
    }
    
    vector<Edge> A;
    for(int i=1;i<=m;i++)
    {
        cur=i;
        memset(vis, 0, sizeof(vis));
        dfs(1);
        bool flag=0;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                flag=1;
            }
        }
        if(flag)
        {
            A.push_back(e[i]);
        }
    }
    sort(A.begin(),A.end());
    for(int i=0;i<A.size();i++)
    {
        cout<<A[i].u<<' '<<A[i].v<<endl;
    }

    return 0;
}

posted @ 2020-12-14 14:40  K1øN  阅读(71)  评论(0)    收藏  举报