Forest Program(2019ccpc秦皇岛F)

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

题意:删掉一些边使得图不存在点双,求方案数。

分析:若一条边不属于点双,那么这条边有删和不删俩种选择,若找到点双,点双中必须删掉一条边(题目有保证一条边只能属于一个点双,所以不用担心一条边用于多个点双)tarjan找点双,若为点双则必须删掉点双中的一条边

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define pii pair<int,int>
const int M=3e5+5;
const int mod=998244353;
vector<int>g[M];
//vector<pii>bcc[M];
pii stk[M];
int low[M],dfn[M],tot,top,cnt;
ll countt[M];
void tarjan(int u,int f){
    low[u]=dfn[u]=++tot;
    for(int i=0;i<g[u].size();i++){
        int v=g[u][i];
        pii e=make_pair(u,v);
        if(!dfn[v]){
            stk[++top]=e;
            tarjan(v,u);
            low[u]=min(low[u],low[v]);
            if(low[v]>=dfn[u]){
                cnt++;
                int len=top;
                while(stk[top]!=e){
                    //bcc[cnt].pb(stk[top--]);
                    top--;
                }
                //bcc[cnt].pb(stk[top--]);
                top--;
                countt[cnt]=len-top;
            }
        }
        else if(v!=f){
            if(dfn[v]<dfn[u])
                stk[++top]=e,low[u]=min(low[u],dfn[v]);
        }
    }
}
ll ksm(ll a,ll b){
    ll t=1ll;
    while(b){
        if(b&1)
            t=(t*a)%mod;
        b>>=1;
        a=(a*a)%mod;
    }
    return t;
}
ll mi[M];
int main(){
    for(int i=0;i<=M-5;i++)
        mi[i]=ksm(2ll,1ll*i);
    //cout<<mi[3]<<endl;
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        tot=top=cnt=0;
        for(int i=0;i<=n;i++)
            low[i]=dfn[i]=0,countt[i]=0,g[i].clear();
        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            g[u].pb(v);
            g[v].pb(u);
        }
        for(int i=1;i<=n;i++)
            if(!dfn[i])
                tarjan(i,-1);

        ll ans=1ll;
    //    cout<<"cnt"<<cnt<<endl;
        for(int i=1;i<=cnt;i++){
            if(countt[i]>1){
                ans*=mi[countt[i]]-1;
                m-=countt[i];
                ans%=mod;
            }

        }
        if(m>=1)
            ans*=mi[m];
        printf("%lld\n",ans%mod);
    }
    return 0;
}

经验:得重新认识点双和边双,清楚定义

原文地址:https://www.cnblogs.com/starve/p/11609939.html

时间: 2024-11-10 03:27:10

Forest Program(2019ccpc秦皇岛F)的相关文章

[CCPC2019秦皇岛] F. Forest Program

[CCPC2019秦皇岛 F] Link https://codeforces.com/gym/102361/problem/F Description 给定一个仙人掌,删去一些边可以让它变成一个森林(一棵树也是森林),求方案数. \(n \le 300000, m \le 500000\) Solution 用 DFS 暴力找环,然后乘法原理算一下即可.注意非环边也会有贡献. DFS 可以模仿 Tarjan 算法写. Code #include <bits/stdc++.h> using n

2019-ccpc秦皇岛现场赛

https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到题,,,(感觉在cf上做过,, (然后写反输出白白wa一发,,,,,emmmmmmmm F - Forest Program 这题我感觉是第二道签到题,,,很简单,,但是我一个人读完题后就想着怎么写代码,,,然后wa了无数发才反应过来还要考虑树边的情况,,,丧失理智 ,,,, 题意就是给一个 仙人掌

2019CCPC秦皇岛赛区

目录 Solutions F. Forest Program I. Invoker J. MUV LUV EXTRA Link Solutions F. Forest Program 题意: 思路: dfs+栈 判环 设图中环的大小分别为 \(c_1\) \(c_2\), ..., \(c_k\),不属于任何一个环的边数为 \(b\),则答案为: \(2^b*\prod _{i=1}^{k}{(2^{c_i}-1)}\) dfs 判环时 各点入栈 若点已存在于栈中 则存在环 计算环大小即可 不必

2019 CCPC秦皇岛 F Forest Program

关键在于怎样找到各个环及其边数. dfs搜 双连通分量 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef pair<int,int> piir; 4 typedef long long ll; 5 const int maxn = 3e5+5; 6 const int maxm = 5e5+5; 7 const int INF = 0x3f3f3f3f; 8 const int mod = 998244353; 9

2019CCPC秦皇岛 I Invoker

题意: 就是魔法召唤技能,最少的符号数之类的. 思路: 线性dp题 记 dp[i][6] 为祈唤出第 i 个技能之后,身上三个法球的先后顺 序为 0 ∼ 5 的状态的最少按键数.(就是一种技能的三个发球的排列总数为6) 转移就暴力枚举上一个技能的结尾状态,然后算一下有几个 法球是可以重复使用的,取个最优值就行了. 预处理一下第i种技能的排列为z1的时候转移到第j种技能状态为z2需要的步数数组dis 写一下全排列,然后多写函数结构化程序,实现也是较为简单的. 代码: #define _CRT_SE

【2019CCPC秦皇岛:A】Angle Beats 分类讨论 (unordered_map 加 hash)

题意:n个给定点,q个询问点,每次询问给出一个坐标A,问从n中选定两个点B,C,有多少种方案使得ABC是个直角三角形. 思路:直角三角形能想的就那几个,枚举边,枚举顶点,这个题都行,写的枚举顶点的,A点分两种情况,1是直角,2是非直角.防止误差,用分数表示斜率,然后用了map<pair<int,int> int> 发现t了,改成unordered_map发现这个unordered_map只能映射一个,即unordered_map<ll, int>,所以得用到hash,把

【日常训练】【ACM】2019-10-27_ccpc2019秦皇岛

A: Angle Beats 我们写掉了,但是不是我写的,是pcf写的.他卡了好久常数,所以我就不写题解了 D: Decimal 题面 每次给你一个正整数\(n\),问\(\frac{1}{n}\)在十进制下是否是无限小数. 题解 如果\(n\)只有2或者5作为质因子,那么就不是,否则就是. 这题很傻. E: Escape 这题有点意思. 网络流 题面 给你一个\(n\times m\)的网格,有些格子可能有障碍. 在第\(1\)行上面放了若干个机器人,第\(i\)个在\((0,p_i)\).

F#(1)

如果你也会C#,那不妨了解下F#(1):F# 数据类型 简单介绍 F#(与C#一样,念作“F Sharp”)是一种基于.Net框架的强类型.静态类型的函数式编程语言.可以说C#是一门包含函数式编程的面向对象编程语言,而F#是一门包含面向对象的函数式编程语言.可以查看官方文档了解更多信息. 本系列文章假设你在了解C#的情况下,将F#与C#在异同点上进行说明,让读者能快速地对F#有个系统的了解.才疏学浅,错漏难免,如果您在阅读过程中有什么建议或意见,还请不吝指教. 函数式编程这几年一起不温不火,但相

2019 China Collegiate Programming Contest Qinhuangdao Onsite

目录 Contest Info Solutions A. Angle Beats D. Decimal F. Forest Program I. Invoker J. MUV LUV EXTRA Contest Info Practice Link Solved A B C D E F G H I J K L 5/12 O - - O - O - - - O ? - O 在比赛中通过 ? 赛后通过 ! 尝试了但是失败了 - 没有尝试 Solutions A. Angle Beats 题意: 给出