删边(cip)
删边(cip)
给出一个没有重边和自环的无向图,现在要求删除其中两条边,使得图仍然保持连通。
你的任务是计算有多少组不合法的选边方案。注意方案是无序二元组。
Sol
神题,无从下手啊。
考虑点dfs建出dfs树,边分为两种--树边,非树边。
那么割断两条非树边显然不行。
考虑割一条树边a和一条非树边b,当b为a子树内唯一返祖边或a子树无返祖边时不行。
考虑两条树边ab,我们把一条返祖边打在它覆盖的所有树边上,如果这两条非树边被覆盖的集合相同,那么他们中间的那一段就会断开,就可以。
于是可以把每条返祖边给个hash值,开始处加,结束处减,统计每条边的覆盖集合,在排序统计下就行。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 300005
#define rand() ((rand()<<15)|rand())
#define ll unsigned long long
using namespace std;
int n,m,head[maxn],tot,flag[maxn],t;
int sum[maxn],sz[maxn],a[maxn],deep[maxn];
struct node{
int v,nex;int h;
}e[maxn*];
ll ans,ha[maxn];
void add(int t1,int t2){
e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
}
void dfs(int k,int fa){
flag[k]=; deep[k]=deep[fa]+;
for(int i=head[k];i;i=e[i].nex){
if(flag[e[i].v]){
if(e[i].v!=fa&&deep[e[i].v]<deep[k]){
ha[e[i].v]-=e[i].h;
ha[k]+=e[i].h;
sz[k]++;sz[e[i].v]--;
}
continue;
}
dfs(e[i].v,k);
}
}
void tj(int k){
flag[k]=;
for(int i=head[k];i;i=e[i].nex){
if(flag[e[i].v])continue;
tj(e[i].v);
sz[k]+=sz[e[i].v];
ha[k]+=ha[e[i].v];
}
if(k!=){
if(!sz[k])ans+=m-,t++;
if(sz[k]==)ans++;
}
}
int main(){
srand();
cin>>n>>m;
for(int i=,t1,t2;i<=m;i++){
scanf("%d%d",&t1,&t2);
add(t1,t2);add(t2,t1);
e[tot].h=e[tot-].h=rand()*rand();
}
dfs(,);
memset(flag,,sizeof flag);tj();
sort(ha+,ha+n+);
for(int i=;i<=n;i++){
int j=i;
for(;ha[j+]==ha[i];j++);
if(ha[j]==)continue;
int len=j-i+;
ans=ans+1LL*len*(len-)/;
i=j;
}
ans=ans-1LL*t*(t-)/;
cout<<ans<<endl;
return ;
}
删边(cip)的更多相关文章
- [西安交大附中集训] d6 删边(cip)
B. 删边(cip.cpp/in/out 1S/256M) 题面 给出一个没有重边和自环的无向图,现在要求删除其中两条边,使得图仍然保持连通. 你的任务是计算有多少组不合法的选边方案.注意方案是无序二 ...
- EF里单个实体的增查改删以及主从表关联数据的各种增删 改查
本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...
- webform(八)——LinQ简单增、删、改、查
一.简单介绍 1.LinQ to Sql类(NET Language Integrated Query (LINQ) ) LINQ定义了大约40个查询操作符,如select.from.in.where ...
- Oracle数据库,数据的增、删、改、查
oracle数据库中,数据的增.删.改.查,通过SQL语句实现 SQL:结构化查询语言: 特点:不区分大小写:字符串用单引号引起来:语句结束用分号表示结束: 行注释,在语句的最前面加"--& ...
- Oracle数据库的 增、删、改、查
有时候数据库的查询语句一时想不起来,或不确定是不是语句写的正确,现在整理了一下标准的基本查询语句,便于以后牢记: .数据操作语言 DML:添加(insert into).修改(update set ...
- react+redux官方实例TODO从最简单的入门(3)-- 删
上一篇文章我们实现了增删改查中<增>这个功能 那么这一篇我们将实现第二个功能,删! 首先增加一个状态: actions中增加对应的约定 到reducer里面设置执行的函数(这里todo.i ...
- 【极力分享】[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例【转载自https://segmentfault.com/a/1190000004152660】
[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例 本文我们来学习一下在Entity Framework中使用Cont ...
- ASP对XML的增、删、改、查
首先看一下xml文件 text.xml 'encoding使用gb2312中文,如果要用英文则用utf-8 <?xml version="1.0" encoding=&quo ...
- 删掉SQL Server登录时登录名下拉列表框中的选项
问题: 我以前创建了一个登录名如kpi,之后在"安全性-登录名" 里删掉了,但是每次登录时,登录名的下拉框中总是能显示登录名kpi,怎么把它删掉呢? 解决方案: 1).SQL Se ...
随机推荐
- Python拼接字符串的7种方法
1.直接通过+操作: s = 'Python'+','+'你好'+'!'print(s) 打印结果: Python,你好! 2.通过join()方法拼接: 将列表转换成字符串 strlist=['Py ...
- requests,lxml爬启信宝
首先, 添加requests模块: 然后, 添加lxml模块: 启信宝登录抓包: QiXinBao.py: import requestsfrom lxml import etree loginUrl ...
- 巧用浏览器F12调试器定位系统前后端bug
做测试的小伙伴可能用过httpwatch,firebug,fiddler,charles等抓包(数据包)工具,但实际上除了这些还有一个简单实用并的抓包工具,那就是浏览器的F12调试器. httpwat ...
- Angualr6访问API
参照 草根专栏- ASP.NET Core + Ng6 实战: https://v.qq.com/x/page/a0769armuui.html 1.environment.ts 添加apiUrlBa ...
- 【Random】-随机数字-jmeter
参数化 Random 参数化,存储结果的变量名,名字写了,就可以给其它请求使用
- Aizu - 2249
注意先保证距离最短,再来判断价格 邻接矩阵回朝内存 ,要用邻接表的 #include<bits/stdc++.h> using namespace std; #define inf 0x ...
- spark相关脚本解析
spark-shell/spark-submit/pyspark等关系如下: #spark-submit 逻辑: ########################################### ...
- C++复合类型(结构,共用体,枚举)
•结构是用户定义的类型,而结构的声明定义了这种类型的数据属性. 一.关键字struct声明: 定义了一种新类型 struct inflatable{ char name[20];//结构成员 fl ...
- 零基础自学人工智能,看这些资料就够了(300G资料免费送)
为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...
- Spring Boot - Filter实现简单的Http Basic认证
Copy自http://blog.csdn.net/sun_t89/article/details/51916834 @SpringBootApplicationpublic class Spring ...