hdu4738 Caocao's Bridges

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

题目大意:曹操赤壁之战大败,于是卷土重来。为了避免水上作战,他在长江上建立了一些岛屿,这样他的士兵就可以在岛屿上攻击到

周瑜的军队。同时,为了更方便各个岛屿的支援与部署,他在一些岛屿之间又修建了一些桥,并且在桥上准备了一些守卫的士兵。周瑜

看到后当然要破坏这些岛屿的连接,然而诸葛亮只给他留下了一个bomb,他如果想要炸毁一座桥需要派出至少和守卫士兵数相等的敢死队

去。问最少需要派出多少人。

很佩服出题人有这么大的脑洞。

很直白的连通图找桥,然后取这些桥中权值(守卫士兵数)最小的即可。可是我太天真了。

WA了9次。呵呵呵呵呵

坑点:

1:可能一开始给出的图根本不是连通图(这也可以),这样岛屿没连接,不用人去, 输出人数是0;

2:输入中含有重复边,就是两个岛屿之间有两座桥。这样明显这两点间的边即使是桥也不算了,耿直的

用数组的直接将权值归为oo即可。或者用邻接表写的标记重边。

3:某桥上的守卫士兵数是0.(一开始把图的权值初始化成0了结果这条边被判成不存在了。。。WA了三次后才发现,初始化为-1才判进去。)

按题面的叙述是0,然而正确的是1。因为bomb至少需要一个人带过去...

附AC代码:

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define oo 0x3f3f3f3f
int G[1005][1005], ans, fa[1005], dfn[1005], low[1005], Time, m, n, nblocks;
void Tarjin(int u, int father)
{
    dfn[u] = low[u] = ++Time;
    fa[u] = father;
    for(int i=1; i<=n; i++)
    {
        if(G[u][i]!=-1)
        {
            if(!dfn[i])
            {
                Tarjin(i, u);
                low[u] = min(low[u], low[i]);
                if(low[i]>dfn[u])ans = min(ans, G[u][i]);
            }
            else if(i!=father)
                low[u] = min(low[u], dfn[i]);
        }
    }
}
int main()
{
    while(scanf("%d %d", &n, &m), m+n)
    {
        int a, b, c;
        memset(low, 0, sizeof(low));
        memset(dfn, 0, sizeof(dfn));
        memset(G, -1, sizeof(G));
        for(int i=1; i<=m; i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            if(G[a][b]==-1)
            G[a][b] = G[b][a] = c;
            else G[a][b] = G[b][a] = oo;
        }
        nblocks = 0;
        Time = 0;
        ans = oo;
        Tarjin(1, -1);
        int flag = 1;
        for(int i=1; i<=n; i++)
            if(!dfn[i])
            {
                flag = 0;
                break;
            }
        if(!flag)
        {
            printf("0\n");
            continue;
        }
        if(ans==oo)printf("-1\n");
        else printf("%d\n", ans==0?1:ans);
    }
    return 0;
}

hdu4738 Caocao's Bridges

时间: 2024-08-29 05:22:49

hdu4738 Caocao's Bridges的相关文章

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(求割边最小权值)

http://acm.hdu.edu.cn/showproblem.php?pid=4738 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e3+4,maxm=1e6+4; int dfn[maxn],low[maxn],head[maxn]; int n,m,cnt=0,rt,ans

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——tarjan求桥

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

kuangbin专题 专题九 连通图 HDU 4738 Caocao&#39;s Bridges

题目链接:https://vjudge.net/problem/HDU-4738 题目:tarjan求桥,坑点: 题目说是分岛任务...如果所有岛之间没有完全连通,就不需要执行任务了...答案直接是0... 桥上可能没人,但是,炸弹需要一个人去送,所以至少1个人. 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 const int N

HDU 4738 Caocao&#39;s Bridges(割边)

乍一看一个模板题,仔细一看还是模板题,但是三个坑.1,不是连通图,放0个.2 守卫为0,放1个. 3注意重边. #include<iostream> #include<cstdio> #include<vector> #include<queue> #include<algorithm> #include<stack> #include<cstring> using namespace std; #define maxn

HDU 4738 Caocao&#39;s Bridges(找割边)

HDU 4738 Caocao's Bridges 题目链接 注意几个坑,可能重边,至少要派一个人去炸,没有连通的时候就不用炸了 代码: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int N = 1005; const int INF = 0x3f3f3f3f; int pre[N], low[N

[HDOJ4738]Caocao&#39;s Bridges(双联通分量,割边,tarjan)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 给一张无向图,每一条边都有权值.找一条割边,使得删掉这条边双连通分量数量增加,求权值最小那条. 注意有重边,ACEveryDay里群巨给的意见是tarjan的时候记录当前点是从哪条边来的. 注意假如桥的权值是0的时候也得有一个人去炸…… 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7