zoj2588(无向图求割边)

这道题其实就是一道很简单的割边的模板题,不过需要处理重边导师意见有点麻烦的事

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN=20005;
const int MAXM=200005;
struct edge
{
    int to,next,id,num;//这个地方需要在原有模板的基础上加上id(边的标号)和num(是否为重边)
    bool cut;
} edge[MAXM];
int ans[MAXM];
int head[MAXN],tot;
int low[MAXN],dfn[MAXN],Stack[MAXN];
int Index,top;
bool Instack[MAXN];
bool cut[MAXN];
int add_block[MAXN];
int bridge;
int T,a,b;
long long n,m;
void addedge(int u,int v,int x,int num)//我在传递四个值的时候对了,不传递num的时候没有处理好
{
    edge[tot].to=v;
    edge[tot].next=head[u];
    edge[tot].cut=false;
    edge[tot].id=x;
    edge[tot].num=num;
    head[u]=tot++;
}
void tarjan(int u,int pre)
{
    int v,k=1;
    low[u]=dfn[u]=++Index;
    Stack[top++]=u;
    Instack[u]=true;
    int son=0,sum=0;
    for(int i=head[u]; i!=-1; i=edge[i].next)
    {
        v=edge[i].to;
        if(v==pre)
            continue;
        if(!dfn[v])
        {
            son++;
            tarjan(v,u);
            if(low[u]>low[v])
                low[u]=low[v];
            if(low[v]>dfn[u]&&edge[i].num!=1)
            {
                bridge++;
                edge[i].cut=true;
                edge[i^1].cut=true;
                ans[bridge]=edge[i].id;//这里直接是边的标号
            }
        }
        else if(low[u]>dfn[v])
            low[u]=dfn[v];
    }
    if(u==pre)
        add_block[u]=son-1;
    Instack[u]=false;
    top--;
}
void init()
{
    tot=0;
    bridge=0;
    Index=0;
    memset(low,0,sizeof(low));
    memset(dfn,0,sizeof(dfn));
    memset(Instack,0,sizeof(Instack));
    memset(add_block,0,sizeof(add_block));
    memset(edge,-1,sizeof(edge));
    memset(head,-1,sizeof(head));
    memset(ans,0,sizeof(ans));
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>T;
    while(T--)
    {
        init();
        cin>>n>>m;
        for(int i=1; i<=m; i++)
        {
            cin>>a>>b;
            for(int j=head[a]; j!=-1; j=edge[j].next)
                if(edge[j].to==b)
                {
                    edge[i].num=1;
                }
            addedge(a,b,i,edge[i].num);
            addedge(b,a,i,edge[i].num);
        }
        for(int i=1; i<=n; i++)
        {
                tarjan(i,i);
        }
        cout<<bridge<<endl;//对输出进行处理的时候,首先需要考虑输出空行的问题,然后还需要需要考虑没有桥的时候,在这里吃了好大的亏,一直WA到死
        sort(ans+1,ans+bridge+1);
        for(int i=1,u=bridge; i<=bridge; i++)
         {
              cout<<ans[i];
              if(--u)
                cout<<" ";
         }
        if(bridge)
            cout<<endl;
            if(T)
                cout<<endl;
    }
    return 0;
}
时间: 2024-08-01 23:09:46

zoj2588(无向图求割边)的相关文章

ZOJ 2588 Burning Bridges(无向图求割边)

ZOJ 2588 Burning Bridges 链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2588 题意:给定一个无向图连通图,(其中可能有重边),要求去掉一条边之后,使得整个图不再连通.输出这些符合条件的边的序号. 思路:这就是一个简单的无向图求割边,需要注意的是这个无向图有重边,重边一定不是割边. 代码: /*========================================= 无向图求割点

HDU 4738——Caocao&#39;s Bridges——————【求割边/桥的最小权值】

Caocao's Bridges Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4738 Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn't give up. Caocao's army st

zoj2588 Burning Bridges --- 求割边

#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define inf 0x3f3f3f3f #define eps 1e-

zoj2588(连通分量,求解无向图的割边)

B - Burning Bridges Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Description Ferry Kingdom is a nice little country located on N islands that are connected by M bridges. All bridges are very beautiful and a

ZOJ Problem - 2588 Burning Bridges tarjan算法求割边

题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍). 需要注意的就是此处有多重边,题目中要求输出确定的不能被删除的边,而多重边的保留不是可以确定的,所以多重边都是不可以被保留的,我们可以在邻接表做一个flag的标记,判断他是不是多重边. 注意建图的时候数组应该是m × 2,因为这里是无向边,当心RE! 注意输出的时候编号是必须要拍好序再输出. 还有

连通性2 无向图的割边 (cut edge)

这是DFS系列的第二篇 割边的概念 In graph theory, a bridge, isthmus, cut-edge, or cut arc is an edgeof a graph whose deletion increases its number of connected components. Equivalently, an edge is a bridge if and only if it is not contained in any cycle. A graph is

ZOJ 3792 Romantic Value 最小割+求割边的数量

点击打开链接 Romantic Value Time Limit: 2 Seconds      Memory Limit: 65536 KB Farmer John is a diligent man. He spent a lot of time building roads between his farms. From his point of view, every road is romantic because the scenery along it is very harmon

ZOJ 2588 求割边问题

题目链接:http://vjudge.net/problem/viewProblem.action?id=14877 题目大意: 要尽可能多的烧毁桥,另外还要保证图的连通性,问哪些桥是绝对不能烧毁的 我们很容易看出不能烧毁的是必然是作为割边存在的桥. 求割边,我们用Tarjan算法,这与求割点有点小区别在与,对于(u,v)的点low[v]>=dfn[u]时就表示u为割点,而low[v]>dfn[u]时才能说明(u,v)是一条割边 因为这里要求出割边的序号,所以在写边的结构体时,用id代表桥的序

tarjan[强连通分量][求割边割点][缩点]

强连通分量: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=100000+15; 5 struct Edge { 6 int x,y,next; 7 Edge(int x=0,int y=0,int next=0): 8 x(x),y(y),next(next) {} 9 } edge[maxn]; 10 int sumedge,head[maxn]; 11 int n,m; 12 int ins(in