LOJ-1308-Ant network(蚂蚁的网络)-求割点分隔开的子图个数及乘积
网上的题解大都模糊,我可能写的也比较模糊吧,讲究看看。
大致题意:
原图没有一个割点时,特殊考虑,至少ans1=2个通风井,方案数n*(n-1)/2;
原图上有多个割点时,每个(由割点限制成几部分的)联通块个数即为ans1;需要dfs进行vis标记和iscut区分,不重不漏;
ans2,建设时避开在割点上建设通风井(通风井数量可最小化,以免通风井损毁后还需再建一个以备万一);求解时:当一个颜色块有两个割点时,摧毁一个蚂蚁们总可以通过另一个割点紧急转移;当一个颜色块有仅一个割点时,摧毁割点后就必须在颜色块内部建设一个。
//五点双环一割点,(发现这个样例:颜色块为1割点不为1,用颜色块来计算就不对头了!)
12
5 6 0 1 1 2 0 2 2 3 2 4 3 4
AC题解:
//头文件都私奔了!
#include<set>
using namespace std;
#define N 10100
#define inf 0x3f3f3f3f
typedef unsigned long long ULL;
int n,m,Time; //单指向边的共m条;
vector<int>G[N]; ///一次存贮1个内存!!
int dfn[N],low[N];
int color_num,in[N];
stack<int>st;
int father[N];
int cas;
int color[N]; ///表示i在的颜色块的编号,本题无用!
bool iscut[N]; ///表示i 是否为割点
bool vis[N]; ///dfs中有用
int test_num; ///dfs中从某u点(非割点)出发可以遇见的
set<int>ss; ///从某u点(非割点)出发dfs中的遇见割点(方便去重用set)
ULL mod;///模数 void init()
{
for(int i=;i<=n;i++){
G[i].clear();
}
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
Time=;
color_num=;
memset(in,,sizeof(in));memset(color,,sizeof(color));
memset(iscut,false,sizeof(iscut));
memset(father,-,sizeof(father));
while(!st.empty())st.pop();
}
void tarjan(int u,int fa)
{
dfn[u]=low[u]=++Time;
st.push(u);in[u]=;
father[u]=fa; ///别忘记!
for(int i=;i<(int)G[u].size();i++){
int v=G[u][i];
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else if(v!=fa&&in[u]==){ ///子节点在队列中并且不是父节点
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
++color_num;
int top;
do{
top=st.top();st.pop();
in[top]=;
color[top]=color_num; //细节!
}while(top!=u);
}
}
ULL fact_mod(ULL x){ ///对2的64次方取模(mod只有一半) while(x/(ULL)>=mod)
x=x-mod-mod;
return x;
}
void dfs(int u)
{
vis[u]=;
test_num++; ///从u点出发的由割点分隔开的联通图中的非割点数目
for(int i=;i<(int)G[u].size();i++){
int v=G[u][i];
if(iscut[v]){
ss.insert(v);continue;
}
if(iscut[v]||vis[v])continue; ///vis防重复,iscut防dfs到切点
dfs(v);
}
} void solve() //缩点
{
tarjan(,-); ///单源点图,求DAG
int ans1=;
ULL ans2=;
int rootsons=,u,cnt=; ///cnt表示割点个数
for(int i=;i<n;i++){ ///求割点,分类特判源点0是否为割点
if(father[i]==)
rootsons++;
else{
u=father[i]; ///父节点
if(dfn[u]<=low[i]&&iscut[u]==false){
iscut[u]=true;cnt++;
}
}
}
if(rootsons>){ ///特判源点
iscut[]=true;cnt++;
}
if(cnt==){ ///没有割点的图
ans1=;
ans2=(ULL)n*(n-)/;
ans2=fact_mod(ans2);
}
else{
memset(vis,false,sizeof(vis));
for(int i=;i<n;i++){ ///多个割点的图
if(iscut[i]||vis[i])
continue;
ss.clear();test_num=;
dfs(i);
if(ss.size()<=){
ans1++;ans2=ans2*(ULL)test_num;
}
}
}
ans2=fact_mod(ans2);
printf("Case %d: %d %llu\n",++cas,ans1,ans2);
}
int main()
{
int T;
scanf("%d",&T);
cas=;
mod=(ULL); ///求模数
for(int i=;i<=;i++){
mod=mod*(ULL);
} while(T--){
scanf("%d%d",&n,&m);
init();
int x,y;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
solve();
}
return ;
}
LOJ-1308-Ant network(蚂蚁的网络)-求割点分隔开的子图个数及乘积的更多相关文章
- poj 1144 Network【双连通分量求割点总数】
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11042 Accepted: 5100 Descript ...
- B - Network - uva 315(求割点)
题意:给一个无向连通图,求出割点的数量. 首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束(很蛋疼的输入方式). 分析:割点的模板题 ...
- Network UVA - 315(求割点)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- POJ 1144 Network(Tarjan求割点)
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12707 Accepted: 5835 Descript ...
- uva 315 Network(无向图求割点)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- NFS - Network File System网络文件系统
NFS(Network File System/网络文件系统): 设置Linux系统之间的文件共享(Linux与Windows中间文件共享采用SAMBA服务): NFS只是一种文件系统,本身没有传输功 ...
- POJ 1144 Network(tarjan 求割点个数)
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17016 Accepted: 7635 Descript ...
- poj 1144 Network 无向图求割点
Network Description A Telephone Line Company (TLC) is establishing a new telephone cable network. Th ...
- UVA315:Network(求割点)
Network 题目链接:https://vjudge.net/problem/UVA-315 Description: A Telephone Line Company (TLC) is estab ...
随机推荐
- 【作业】Mental Rotation (模拟)
题目链接:https://vjudge.net/contest/345791#problem/L [问题描述] Mental rotation is a difficult thing to mast ...
- [转帖]EPOLL和IOCP比较
EPOLL和IOCP比较 https://blog.csdn.net/educast/article/details/15503179 IOCP 异步非阻塞EPOLL 异步阻塞 EPOLL是半成品 ...
- 安装python的pip库setup.py出现报错的解决过程
错误起因: 第一次安python3.72的时候,直接去官网下了压缩包,解压后也没有exe文件.环境也是手动配置,在之后安装Pycharm的时候,系统找不到解释器,手动加上. 错误经过: 等写程序用到i ...
- MRR,BKA,ICP相关
MRR Multi-Range Read,多范围读,5.6以上版本开始支持 工作原理&优化效果: 将查询到的辅助索引结果放在一个缓冲(read_rnd_buffer_size = 4M)中 将 ...
- Go语言学习笔记(10)——错误处理示例
// 定义一个 DivideError 结构 type DivideError struct { dividee int divider int } // 实现 `error` 接口 func (de ...
- Quartz入门以及相关表达式使用
目的: 1.Quartz简介及应用场景 2.Quartz简单触发器 SimpleTrigger介绍 3.Quartz表达式触发器CronTirgger介绍 4.Quartz中参数传递 5.Spring ...
- Luogu5401 CTS2019珍珠(生成函数+容斥原理+NTT)
显然相当于求有不超过n-2m种颜色出现奇数次的方案数.由于相当于是对各种颜色选定出现次数后有序排列,可以考虑EGF. 容易构造出EGF(ex-e-x)/2=Σx2k+1/(2k+1)!,即表示该颜色只 ...
- apply 和 call 的用法
apply的用法 语法 func.apply(thisArg, [argsArray]) thisArg 可选的.在func函数运行时使用的this值.请注意,this可能不是该方法看到的实际值:如果 ...
- flutter从入门到精通五
在flutter的世界里,一切都是Widget,图像,文本,布局模型等等,一切都是Widget flutter中,尽量将Widget放在MaterialApp.其封装了所需要的一些Widget,Mat ...
- C#基础加强笔记
1面向对象 类:包含字段.属性.函数.构造函数 字段:存储数据 属性:保护字段 get set 函数:描述对象的行为 构造函数:初始化对象,给对象的每个属性赋值 面向对象的好处:让程序具有扩展性 类决 ...