首页 > 其他分享 >矿场搭建(tanjar)

矿场搭建(tanjar)

时间:2024-03-20 10:01:31浏览次数:16  
标签:head 矿场 int memset tanjar dfn low sizeof 搭建

题目描述

样例

输入

9
1 3 
4 1
3 5
1 2
2 6
1 5
6 3
1 6
3 2
6 
1 2
1 3
2 4
2 5
3 6
3 7
0

输出

Case 1: 2 4
Case 2: 4 1

法一(点双)

考虑每一个vDCC,每个割点可以看成不同连通块间的通道,如果没被砸,能通过这个割点跑到其他连通块中。

  • 情况一

如果一个vDCC中没有割点,需要两个安全通道(防止其中一个被砸)。

  • 情况二

有一个割点,割点一定建,除此之外每个vDCC还要建一个,防止割点被砸。

  • 情况三

有两个割点,不用建,一个塌了走另外一个去其他vDCC。

  • 综上

所以求vDCC时顺便记录割点数量,分情况。

方案数:\(sum\),安全通道数:\(cnt\);

  1. 情况一:\(cnt+=2\) , \(sum *= (sz-1)*sz/2\)

  2. 情况二:\(cnt+=1\) , \(sum*=(sz-1)\)

  3. 情况三:无

code
#include<bits/stdc++.h>
using namespace std;
const int N= 1005 ;
int n,m; int head[N],tot;
struct E
{
	int nxt,to;
} e[N];
void add(int u,int v)
{
	e[++tot]={head[u],v};
	head[u]=tot;	
} 
int dfn[N],low[N],t,num,sz[N];
stack <int> st;
bool cut[N];
vector<int> ds[N];
void tj(int s,int fa)
{
	dfn[s]=low[s]=++num;
	st.push(s);
	if(head[s]==0&&s==fa)
	{
		ds[++t].push_back(s);
		return;
	 } 
	int son=0;
	for(int i=head[s];i;i=e[i].nxt)
	{
		int to=e[i].to;
		if(!dfn[to])
		{
			son++;
			tj(to,fa);
			low[s]=min(low[s],low[to]);
			if(low[to]>=dfn[s])
			{
				if(s!=fa||son>1) cut[s]=1;
				t++;
				int now;
				while(now!=to)
				{
					now=st.top(); st.pop();
					ds[t].push_back(now);
				}
				ds[t].push_back(s);
			}
		}
		else low[s]=min(low[s],dfn[to]);
	}
}
int main()
{
	int T=0;
	while(scanf("%d",&m)&&m!=0)
	{
		memset(head,0,sizeof(head));tot=0;
		memset(low,0,sizeof(low));
		memset(dfn,0,sizeof(dfn));
		memset(cut,0,sizeof(cut));
		for(int i=1;i<N;i++) ds[i].clear();
		n=0; t=0; num=0;
		
		for(int i=1;i<=m;i++)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			n=max({x,y,n});
			add(x,y); add(y,x);
		}
		for(int i=1;i<=n;i++)
			if(!dfn[i]) tj(i,i);
		long long ans=0,sum=1;
		for(int i=1;i<=t;i++)
		{
			int cnt=0,sz=ds[i].size();
			for(int j=0;j<sz;j++) if(cut[ds[i][j]]) cnt++;
			if(cnt==0) ans+=2,sum*=((long long)sz*(sz-1)/2);
			else if(cnt==1)	ans++,sum*=(sz-1);
		}
		printf("Case %d: %lld %lld\n",++T,ans,sum);
	}
	return 0;
}

法二(dfs)

仍然是求连通块,并记录割点数量,可以考虑求出割点后用 \(dfs\) 统计。

code
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
#define int long long
int m,n;
int head[N],tot;
struct E
{
	int nxt,to;
} e[N];
void add(int u,int v)
{
	e[++tot]={head[u],v};
	head[u]=tot;
}

int dfn[N],low[N],num;
bool cut[N];
void tj(int u,int root)
{
	dfn[u]=low[u]=++num;
	int son=0;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(!dfn[v])
		{
			son++;
			tj(v,root);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u])
				if(u!=root||son>1) cut[u]=1;
		}
		else low[u]=min(low[u],dfn[v]);
	}
}
int cnt[N],color,c[N];
bool vs[N];
map<int,map<int,int> > ge;
void dfs(int u,int fa)
{
	cnt[color]++;
	vs[u]=1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(vs[v]||fa==v) continue;
		if(cut[v])
		{
			if(!ge[color][v])
			{
				c[color]++;
				ge[color][v]=1;
			}
			continue;
		}
		dfs(v,u);
	}
}
void init()
{
	n=0,num=0;
	memset(head,0,sizeof(head)),tot=0;
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	ge.clear();
	memset(vs,0,sizeof(vs));
	memset(cnt,0,sizeof(cnt));
	memset(c,0,sizeof(c));
	memset(cut,0,sizeof(cut));
	color=0;
}
main()
{
	int T=0;
	while(scanf("%lld",&m)&&m!=0)
	{
		init();
		for(int i=1;i<=m;i++)
		{
			int x,y;
			scanf("%lld%lld",&x,&y);
			add(x,y); add(y,x);
			n=max({x,y,n});
		}
		for(int i=1;i<=n;i++)
			if(!dfn[i]) tj(i,i);
		int ans=0,sum=1; 
		for(int i=1;i<=n;i++)
			if(!cut[i]&&!vs[i])
			{
				color++,dfs(i,0);
				if(c[color]==1) ans++,sum*=cnt[color];
				else if(c[color]==0) ans+=2,sum*=((int)cnt[color]*(cnt[color]-1)/2);
			} 
		printf("Case %lld: %lld %lld\n",++T,ans,sum);
	}
	return 0;
}
参考

https://www.cnblogs.com/Charlieljk/p/17888945.html

https://www.cnblogs.com/K8He/p/15889547.html

标签:head,矿场,int,memset,tanjar,dfn,low,sizeof,搭建
From: https://www.cnblogs.com/ppllxx/p/18084571

相关文章

  • Lvs+keepalived+nginx搭建高可用负载均衡集群
    环境配置master主机192.168.199.149,虚拟IP192.168.199.148back备机192.168.199.150真实服务器1192.168.199.155真实服务器2192.168.199.156关闭防火墙和selinuxmaster配置(149)添加虚拟IPipaddradd192.168.199.148/24devens33下载keepalivedyuminstallkeepali......
  • 070_机器学习搭建环境
    目录机器学习基础环境安装与使用库的安装jupyternotebook使用机器学习基础环境安装与使用库的安装jupyternotebook使用......
  • 树莓派从零开始搭建Samba文件服务器
    树莓派买回来闲置了许久,之前一直有在家局域网看视频学习的需求,周末抽空把树莓派折腾好,搭建了个Samba服务作为文件服务器,挂载磁盘,可以通过ipad或是电脑局域网连接,看剧美滋滋(ノ´ヮ´)ノ*:・゚✧1、树莓派刷机教程树莓派官网第一个带桌面镜像,第二个是带桌面并且带推荐软件的镜像,这里......
  • Hadoop与Spark的x86和ARM混合集群部署【环境搭建篇】
    ​笔者在完成课程设计时,突然想到把大数据框架同时部署到PC端虚拟机以及ARM架构的Linux板上,这篇博客记录集群部署流程以及例程测试。部署架构如下图:若下文与架构图冲突,则以架构图为准。运行环境:PC方面,使用两台Ubuntu20.04LTSFocalFossa虚拟机ARM板子则使用香橙派5(R......
  • Qt+vs2019+PCL1.12.1+VTK9.1环境搭建中的相关问题
    目录1.VS中双击Ui文件无法打开2.VTK9.0以后在QtDesigner中找不到QVTKWidget组件3.无法打开源文件"QVTKOpenGLNativeWidget.h"4.无法打开源文件"QOpenGLWidget"5.QWidget:MustconstructaQApplicationbeforeaQWidget6.无法打开源文件"QtWidgets/QApplicati......
  • Ubuntu搭建Samba服务
    Ubuntu搭建Samba服务使用samba​服务可以跨系统的进行文件共享,安装samba​服务的步骤如下:安装步骤安装基础软件sudoapt-getinstallsambasudoapt-getinstallsmbclient#验证安装samba-V目录配置使用编辑器打开配置文件,以vim​​为例sudovim/etc/samba......
  • 020_Windows快速搭建FTP服务器
    目录搭建FTP服务器,匿名访问安装FTP服务添加FTP站点测试本机上传下载测试上传下载局域网上传下载测试测试网络关闭防火墙上传浏览器测试搭建FTP服务器,用户访问安装FTP服务创建登录FTP服务器的用户名和密码添加FTP站点测试FTP服务ftp客户端工具配置FTP防火墙入站规则搭建FTP服务器......
  • 电商系统源码搭建,让你轻松拥有属于自己的网店
    在开发与测试过程中,需要注意以下几个关键细节:前端页面设计与用户体验:确保前端页面符合系统架构设计中确定的功能模块,同时注重页面设计和用户体验。后端接口安全性与性能:开发后端接口时,要确保接口的安全性和性能,确保前端页面与后端数据的有效交互。数据库设计与优化:根据系统需......
  • 自己搭建代理IP池有哪些好处呢?
    目录写在前面一、获取代理IP二、验证代理IP三、使用代理IP四、定期更新代理IP总结写在前面自己搭建代理IP池有很多好处。首先,使用代理IP可以绕过目标网站的访问限制,隐藏真实的IP地址,提高爬虫的稳定性和可靠性。其次,代理IP池可以提高爬虫的速度和效率,通过动态切换代理......
  • APP自动化第一步:Appium环境搭建
    一、安装AppiumPythonclient包1.直接cmd窗口输入pipinstallAppium-Python-Client2.要确保安装匹配版本的selenium和appium使用命令pipinstallselenium-U首先进入网盘下载这三个软件的压缩包二、安装AppiumServer1.双击打开压缩包Appium2.双击进行安装。 3.......