zoukankan      html  css  js  c++  java
  • POJ 1515 Street Directions (边双连通)

    <题目链接>

    题目大意:

    有m条无向边,现在把一些边改成有向边,使得所有的点还可以互相到达。输出改变后的图的所有边(无向边当成双向的有向边输出)。

    解题分析:

    因为修改边后,所有点仍然需要相互可达,所以原无向图中所有的割边仍然只能是双向边,而对于双连通分量中的边,可以将其中的一些边删除。不难想到,在保证图中所有点仍然相互可达的情况下,当将其删成强连通分量的方案是最优的。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
     
    const int N = 1005 , M = N * N;
    
    struct Edge {
        int from, to, nxt,cut;
    } edge[M];
    
    int dfn[N],low[N],head[N]; 
    int n, m,tot,cnt;
    inline void init(){
        tot = cnt = 0;
        memset(dfn, 0, sizeof dfn);
        memset(head, -1, sizeof head);
    }
    inline void add(int u,int v){
        edge[cnt]=(Edge){u,v,head[u],0};
        head[u]=cnt++;
    }
    void Tarjan(int u, int pre){
        dfn[u] = low[u] = ++tot;
        for (int i=head[u];~i;i=edge[i].nxt){
            int v=edge[i].to;
            if (edge[i].cut) continue;    //如果这个边已经被标记了(标记为-1也是被标记过),则无需改变之前的标记,因为只需要找到一种可行的标记方案即可
            edge[i].cut=1;edge[i^1].cut=-1;     //贪心的将一个方向的边标记
            if (v == pre) continue;
            if (!dfn[v]){
                Tarjan(v, u);
                low[u] = min(low[u], low[v]);
                if (dfn[u] < low[v])edge[i].cut=edge[i^1].cut=1;
            }
            else low[u] = min(low[u], dfn[v]);
        }
    } 
    inline void Solve(){
        for (int i = 0; i < cnt; ++i)
            if (edge[i].cut==1)printf("%d %d
    ", edge[i].from, edge[i].to);
        printf("#
    ");
    }
    int main(){
        int ncase=0;
        while(~scanf("%d%d",&n,&m),n||m){
            printf("%d
    
    ",++ncase);
            init();
            for(int i=1;i<=m;i++){
                int u,v;scanf("%d%d", &u, &v);
                add(u,v);add(v,u);
            }
            Tarjan(1, -1);
            Solve(); 
        }
    }
  • 相关阅读:
    September 29th 2017 Week 39th Friday
    September 28th 2017 Week 39th Thursday
    September 27th 2017 Week 39th Wednesday
    September 26th 2017 Week 39th Tuesday
    September 25th 2017 Week 39th Monday
    September 24th 2017 Week 39th Sunday
    angular2 学习笔记 ( Form 表单 )
    angular2 学习笔记 ( Component 组件)
    angular2 学习笔记 ( Http 请求)
    angular2 学习笔记 ( Router 路由 )
  • 原文地址:https://www.cnblogs.com/00isok/p/10629693.html
Copyright © 2011-2022 走看看