首页 > 其他分享 >洛谷 P3225 矿场搭建

洛谷 P3225 矿场搭建

时间:2024-09-03 08:54:34浏览次数:12  
标签:洛谷 矿场 int 割点 出口 vis 挖煤 P3225 分量

洛谷 P3225 矿场搭建

题意

煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。

请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。

思路

求出所有的点双连通分量。

如果这个分量内没有割点,则需要两个出口,任意设置即可,\(C_n^2\) 种情况。

如果这个分量内有一个割点,任意设置一个不在各点出口即可。

如果出口没塌,这个分量内所有点都能跑到这里。

如果出口塌了,则割点一定没塌,可以跑到其他分量的出口去。

如果这个分量内有两个及以上的割点,则不用设置出口,因为无论哪个点塌了都能跑到其他分量去。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int M=1005;
int n,m,ver[M<<1],nxt[M<<1],head[M],tot,low[M],dfn[M],vis[M],gr,num,cut,cnt,ans0,ans1;
bool isg[M];
void clear(){
    n=0,m=0,tot=0,cnt=0,ans0=0,ans1=1,gr=0,num=0,cut=0;
    memset(low,0,sizeof(low));
    memset(dfn,0,sizeof(dfn));
    memset(ver,0,sizeof(ver));
    memset(nxt,0,sizeof(nxt));
    memset(head,0,sizeof(head));
    memset(isg,0,sizeof(isg));
    memset(vis,0,sizeof(vis));
}
void add(int x,int y){
    ver[++tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void tarjan(int x,int fa){
    low[x]=dfn[x]=++cnt;
    int sum=0;
    for(int i=head[x];i;i=nxt[i]){
        int v=ver[i];
        if(!dfn[v]){
            tarjan(v,x);
            low[x]=min(low[x],low[v]);
            if(fa!=0&&low[v]>=dfn[x])isg[x]=1;
            else sum++;
        }else if(v!=fa){
            low[x]=min(low[x],dfn[v]);
        }
    }
    if(fa==0&&sum>=2)isg[x]=1;
}
void dfs(int x){
    vis[x]=gr;
    num++;
    for(int i=head[x];i;i=nxt[i]){
        int v=ver[i];
        if(isg[v]&&vis[v]!=gr){
            cut++;
            vis[v]=gr;
        }
        if(!vis[v])dfs(v);
    }
}
bool solve(int id){
    clear();
    scanf("%lld",&m);
    if(m==0)return false;
    for(int i=1,u,v;i<=m;i++){
        scanf("%lld%lld",&u,&v);
        add(u,v);
        add(v,u);
        n=max(n,u);
        n=max(n,v);
    }
    for(int i=1;i<=n;i++){if(!dfn[i])tarjan(i,0);}
    for(int i=1;i<=n;i++){
        if(!vis[i]&&!isg[i]){
            ++gr;
            num=cut=0;
            dfs(i);
            if(cut==0){
                ans0+=2;
                ans1*=num*(num-1)/2;
            }else if(cut==1){
                ans0++;
                ans1*=num;
            }
        }    
    }
    printf("Case %lld: %lld %lld\n",id,ans0,ans1);
    return true;
}
signed main(){
    int id=0;
    while(solve(++id));
    return 0;
}

标签:洛谷,矿场,int,割点,出口,vis,挖煤,P3225,分量
From: https://www.cnblogs.com/maniubi/p/18393849

相关文章

  • 洛谷 P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
    题目大意小A和小B,要进行\(N\)次猜拳,每次按照一定周期出拳,胜负情况如下:求出小A和小B分别赢了几次。思路枚举\(N\)次猜拳,每次比较\(a[powera]\)与\(b[powerb]\)(poewra与powerb是a和b数组的索引,详见代码)。CODE#include<bits/stdc++.h>usingnamespacestd;in......
  • 题解:洛谷 P10996 【MX-J3-T3】Tuple
    原题链接介绍一种(也许是正解的)卡常做法先说总体思路:对于每个三元组\((x,y,z)\),若有一个\(w\)满足\((x,y,w),(x,z,w),(y,z,w)\)均存在,则找到了一个合法的四元组\((x,y,z,w)\)。\(20\\rm{Pts}\)做法如果暴力搜索,在遍历每一个三元组时,每一次都扫描所有的\(w\in[1,N]\)......
  • 题解:洛谷 P10497 [USACO03Open] Lost Cows
    原题链接思路+算法首先,考虑读入到\(a_i\)时,如果要得到此时的最优解(指所有牛的编号不重不漏地覆盖\([1,i]\)的所有编号),对于第\(i\)头奶牛,因为在它前面有\(a_i\)头奶牛的编号小于它,所以第\(i\)头奶牛的编号应当为\(a_i+1\)。如果有一头新的奶牛\(i+1\)加入到这个......
  • 题解:洛谷 P10878 [JRKSJ R9] 在相思树下 III
    原题链接解析在操作一时,最小值如果在最后一位,其无法更新任何数,会被删除;否则不在最后一位时一定会被其右侧更大的数更新。所以在操作一时,最小值一定会被更新掉。同理,在操作二时,最大值一定会被更新掉。由此,操作一决定了答案的下限,操作二决定了答案的上限。所以可以得出贪心策略......
  • 洛谷 P11012 颜料
    洛谷P11012颜料题意给出长度为\(n\)的序列\(a\)。定义一段区间\([l,r]\)的绚丽程度\(X_{l,r}\)为\(\sum_{i=1}^{W}\sum_{j=i+1}^W\min(c_i,c_j)\),其中\(W\)是值域,\(c_i\)表示\(a\)序列\([l,r]\)中\(i\)出现的次数,求绚丽程度至少为\(k\)的区间长度最小值。......
  • 洛谷 P11011 点的覆盖
    洛谷P11011点的覆盖题意给定一个四边平行于坐标轴的矩形\(A\),给定\(n\)个在矩形\(A\)内部(可能在边缘上)的点。求有多少个\(A\)的子矩形覆盖了所有\(n\)个点(允许在边缘上)。所有坐标都是整数。思路求出:\(X_1=\max_{i=1}^nx_i\),\(X_2=\min_{i=1}^nx_i\),\(Y_1=\max_......
  • 洛谷题单指南-常见优化技巧-P1950 长方形
    原题链接:https://www.luogu.com.cn/problem/P1950题意解读:在一张n*m个格子的纸上,从没有画过的格子中剪出长方形的方案数。解题思路:1、暴力做法枚举所有的子矩阵O(n^4),然后用二维前缀和计算子矩阵的和,通过和来判断子矩阵是否全部是'.'。2、优化做法针对每一行进行处理,计算包......
  • 洛谷 P2680 [NOIP2015 提高组] 运输计划
    洛谷P2680[NOIP2015提高组]运输计划题意给出一棵树和\(m\)条路径,可以选择一条边,把边权改为\(0\),求\(m\)条路经长度最大值的最小值。思路看到最大值最小,可以想到二分答案,答案具有单调性。考虑如何判定答案\(x\)是否可行。统计所有长度大于\(x\)的路径,统计它们共......
  • 洛谷P5322 [BJOI2019] 排兵布阵 题解
    代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintdp[20001],a[101][101],s,n,m;signedmain(){ cin>>s>>n>>m; for(intj=1;j<=s;j++){ for(inti=1;i<=n;i++){ cin>>a[i][j]; } } for(inti=1;......
  • 洛谷P9751 [CSP-J 2023] 旅游巴士
    传送门:P9751[CSP-J2023]旅游巴士为了那个梦我们扬帆起航,为了理所到来的那天跨越无尽黑夜由于这几天做的题目太少,我用小号立下flag:导致果然做了一晚上。。。。并且最后还是没做出来被我妈强制去睡觉了题目意思:题目很明白了,这里说几个要注意的点:道路均只能单向通行到......