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 ...
随机推荐
- k8s调度器之亲和性和反亲和性/节点选择器
容器在节点(物理机)上是如何部署的 是由调度器scheduler进行调度的 调度策略 随机 通过节点选择器选择某些节点 通过节点亲和性和pod的亲和性及反亲和性实现更细粒度的控制 参考 https:/ ...
- 深入css过渡transition
通过过渡transition,可以让web前端开发人员不需要javascript就可以实现简单的动画交互效果.过渡属性看似简单,但实际上它有很多需要注意的细节和容易混淆的地方. 过渡transitio ...
- [转帖]Linux下逻辑地址、线性地址、物理地址详细总结
Linux下逻辑地址.线性地址.物理地址详细总结 https://www.cnblogs.com/alantu2018/p/9002441.html 总结的挺好的 现在应该是段页式管理 使用MMU和T ...
- java生成验证码结合springMVC
在用户登录的时候,为了防止机器人攻击都会设置输入验证码,本篇文章就是介绍java如何生成验证码并使用在springMVC项目中的. 第一步:引入生成图片验证码的工具类 import java.awt. ...
- 多线程(11) — NIO
Java NIO是new IO的简称,是一种可以替代Java IO的一套新的IO机制.它提供了一套不同于Java标准IO的操作机制,严格来说,NIO与并发并无直接关系,但是使用NIO技术可以大大提高线 ...
- Linux基础-04-权限
1. 查看文件的权限 1) 使用ls –l命令查看文件上所设定的权限. -rw-r--r-- 1 root root 605 Mar 18 20:28 .jp1.tar.gz 权限信息 属主 属组 文 ...
- Python Http-server 使用
Python内置的下载服务器 http.server Python的Web服务器 python2 中SimpleHTTPServer python3 中 http.server 执行 python ...
- PAT(A) 1144 The Missing Number(C)统计
题目链接:1144 The Missing Number (20 point(s)) Description Given N integers, you are supposed to find th ...
- Python复习笔记01
(1)计算机常识 计算机:硬件(运算器,控制器,存储器,输入设备,输出设备)软件 (系统软件, 应用软件) 二进制 整数存储 文件单 位换算 1Byte = 8bit 1KB = 1024Byte 1 ...
- Account locked due to 25 failed logins
Account locked due to 25 failed logins pam_tally2 --user=ops #查看 pam_tally2 --user=ops --reset # ...