Caocao's Bridges---hdu4738(桥)

http://acm.hdu.edu.cn/showproblem.php?pid=4738

题就是求出所有的桥,然后输出桥的权值的最小值。

如果一开始是不连通的,输出0.

图有重边,需要处理, 不能用邻接矩阵。、、、因为邻接矩阵不能表示两点之间有2条路,如果有两条路就不能算是桥;

还有如果取到的最小值是0的话,要输出1,表示要派一个人过去。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
#define N 1100
#define INF 0xfffffff

struct node
{
    int x,y;
} bridge[N];
struct Edge
{
    int v, c, next;
} e[N*N];
int low[N], cnt, dfn[N], n, m, f[N], maps[N][N], head[N], Min;
int Time, nBridge;
void Init()
{
    Time = cnt = nBridge = 0;
    memset(low, 0, sizeof(low));
    memset(dfn, 0, sizeof(dfn));
    memset(bridge, 0, sizeof(bridge));
    memset(f, 0, sizeof(f));
    memset(maps, -1, sizeof(maps));
    memset(head, -1, sizeof(head));
}
void add(int u, int v, int c)
{
    e[cnt].v = v;
    e[cnt].c = c;
    e[cnt].next = head[u];
    head[u] = cnt++;
}
void Tajar(int u, int father)
{
    f[u]=father;
    low[u]=dfn[u]=++Time;
    int k=0;
    for(int i=head[u]; i!=-1; i=e[i].next)
    {
        int v=e[i].v;
        if(father==v&&!k)
        {
            k++;
            continue;
        }
        if(!dfn[v])
        {
            Tajar(v, u);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u])
                Min=min(Min, e[i].c);
        }
        else
        {
            low[u]= min(low[u], dfn[v]);
        }

    }
}

int main()
{
    int a,b,c;
    while(scanf("%d %d",&n,&m), n+m)
    {
        Init();
        for(int i=1; i<=m; i++)
        {
            scanf("%d %d %d",&a,&b,&c);
            add(a, b, c);
            add(b, a, c);
        }
        int k=0;
        Min=INF;
        for(int i=1; i<=n; i++)
        {
            if(!dfn[i])
            {
                Tajar(i,-1);
                k++;
            }
        }
        if(k>1)
        {
            printf("0\n");
            continue;
        }
        if(Min==0)
            Min=1;
        else if(Min==INF)
            Min=-1;
        printf("%d\n", Min);
    }
    return 0;
}

Caocao's Bridges---hdu4738(桥)

时间: 2024-08-26 11:00:30

Caocao's Bridges---hdu4738(桥)的相关文章

hdu 4738 Caocao&#39;s Bridges(桥的最小权值+去重)

http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:曹操有一些岛屿被桥连接,每座都有士兵把守,周瑜想把这些岛屿分成两部分,但他只能炸毁一条桥,问最少需要派几个士兵去;如果不能完成输出-1 1:如果这些岛屿不连通,则不需要派人前去 2:如果桥的守卫是0的话也得派一人去炸毁 3:如果不能完成输出-1 4:输出最少需派的人数 #include<stdio.h> #include<string.h> #include<math.h&

HDU4738 Caocao&#39;s Bridges 无向图的桥

一眼题:找所有的桥,然后求最小权值 但是有很多坑点 1:如果本来不联通 输出0,(这个坑我知道) 2:但是还有一个坑,就是当整个连通,最小桥的权值是0时,也必须派一个人去,wa了无数遍(还是太年轻) #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <string> #include

HDU4738 Caocao&#39;s Bridges(桥)

http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:给定一张无向图,求其中权值最小的一座桥,派最少的士兵去炸掉它!! 思路:直接用tarjan计算出桥并且取其中权值最小者. 此题坑点甚多,1.有可能桥本来就不联通,输出-1.2.桥最小者为0,输出1(至少排一个人去炸桥).3.不要去重边,两个岛之间允许有多座桥,tarjan忽略返回边只忽略一次,加pre_num处理下. 代码: #include<iostream> #include<cstd

【模板】【hdu4738】Caocao&#39;s Bridges——tarjan求桥

题目链接 题目大意: 曹操有N个岛,这些岛用M座桥连接起来,每座桥有士兵把守(也可能没有), 诸葛亮把所有炸弹都带走了,只留下一枚给周瑜(真狠). 周瑜想让这N个岛不连通,但需要派出不小于守桥士兵数的人去炸桥,因为只有一枚炸弹,因此只够炸掉一座桥. 分析: 很明显的求代价最小的桥,当然这道题有几个特殊的地方: 1.图本来就不联通,输出0: 2.无解(不存在桥),输出-1: 3.没人把守,但你还是得派一个人炸桥,输出1: 4.一般情况,输出最小代价. 剩下的就是模板了,不过需要注意的一点是,这道题

hdu-4738.Caocao&#39;s Bridges(图中权值最小的桥)

Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10933    Accepted Submission(s): 3065 Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi.

hdu4738 Caocao&#39;s Bridges

http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:曹操赤壁之战大败,于是卷土重来.为了避免水上作战,他在长江上建立了一些岛屿,这样他的士兵就可以在岛屿上攻击到 周瑜的军队.同时,为了更方便各个岛屿的支援与部署,他在一些岛屿之间又修建了一些桥,并且在桥上准备了一些守卫的士兵.周瑜 看到后当然要破坏这些岛屿的连接,然而诸葛亮只给他留下了一个bomb,他如果想要炸毁一座桥需要派出至少和守卫士兵数相等的敢死队 去.问最少需要派出多少人. 很佩服出题人

HDU 4738 Caocao&#39;s Bridges tarjan求桥

Caocao's Bridges Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn't give up. Caocao's army still was not good at water battles, so he came up with another idea. He built many islands in the Chan

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

HDU 4738 Caocao&#39;s Bridges(求价值最小的桥)

Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn't give up. Caocao's army still was not good at water battles, so he came up with another idea. He built many islands in the Changjiang river, and

Hdu 4738 Caocao&#39;s Bridges (连通图+桥)

题目链接: Hdu 4738 Caocao's Bridges 题目描述: 有n个岛屿,m个桥,问是否可以去掉一个花费最小的桥,使得岛屿边的不连通? 解题思路: 去掉一个边使得岛屿不连通,那么去掉的这个边一定是一个桥,所以我们只需要求出来所有的桥,然后比较每个桥的花费,选取最小的那个就好. 看起来很简单的样子哦!但是这个题目有很多的细节: A:题目中有重边,以后写Tarjan还是清一色判断重边吧.(除非题目特别要求) B:m个桥有可能连通不了这n个桥,这个时候不需要花费. C:当最小花费桥的花费