hdu 4738 Caocao's Bridges(2013杭州网络赛丶神坑)

就是求最小权值的桥。。不过有好几个坑。。。

1:原图不连通,ans=0.

2: m<=n^2 显然有重边,重边必然不是桥,处理重边直接add(u, v, INF).

3:   最小桥边权为0的时候,ans=1,至少要派一个人运炸弹。。。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

const int N = 1111;
const int INF = 100000000;
int n, m;
int pre[N], low[N], dfs_clock;
int bccno[N], vis[N], wi[N][N], g[N][N];
struct Edge
{
    //flag = 1 ->bridge
    int from, to, w, flag;
};
vector G[N];
vector edges;

//add bidir edge
void addedge(int u, int v, int w)
{
    edges.push_back((Edge){u, v, w, 0});
    edges.push_back((Edge){v, u, w, 0});
    int nima = edges.size();
    G[u].push_back(nima-2);
    G[v].push_back(nima-1);
}

int dfs(int u, int fa)
{
    int lowu = pre[u] = ++dfs_clock;
    int sz = G[u].size();
    for(int i=0; i pre[u]) edges[G[u][i]].flag = 1, edges[G[u][i]^1].flag = 1;
        }
        else if(pre[v] < pre[u] && v != fa) lowu = min(lowu, pre[v]);
    }
    return low[u] = lowu;
}

void dfs1(int u)
{
    vis[u] = 1;
    int sz = G[u].size();
    for(int i=0; i 1) addedge(i, j, INF);
            }

        //BU LIANTONG
        memset(vis, 0, sizeof(vis));
        dfs1(0);
        bool flag = 0;
        for(int i=0; i 1
    }
    return 0;
}


你可能感兴趣的:(图论)