首页 > 编程语言 >2023烟台7天编程集训笔记4

2023烟台7天编程集训笔记4

时间:2023-07-13 12:23:37浏览次数:50  
标签:p2 连通 个点 int 编程 maxn result 2023 集训

匈牙利算法

点击查看代码
//匈牙利算法代码 
//匈牙利算法可用邻接矩阵和编表,优化用编表,不优化用邻接矩阵
//时间复杂度:O(n^3)
#include <bits/stdc++.h>
using namespace std;
bool z[maxn][maxn],vis[maxn];//z[i][j]代表左边第i个点和右边第j个点能不能匹配   vis[i]代表右边第i个点在这一轮中有没有被请求匹配过 
int n,m,k,result[maxn],ans;//n:左边有n个点,m:右边有m个点,k:中间有r条边,result[i]代表右边第i个点和左边第result[i]个点匹配 
bool dfs(int i)//让左边第i个点尝试匹配,返回是否成功 
{
	for(int j=1;j<=m;j++)//让左边的第i个点和右边第j个点尝试匹配 
	{
		if(z[i][j]&&!vis[j])
		{
			vis[j]=true;
			if(!result[j]||dfs(result[j]))
			{
				result[j]=i;
				return true;
			} 
		}
	} 
	return false;
}
signed main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)
	{
		int p1,p2;
		cin>>p1>>p2;
		z[p1][p2]=true;
	 } 
	for(int i=1;i<=n;i++)
	{
		memset(vis,false,sizeof(vis));
		if(dfs(i)) ans++;
	} 
	cout<<ans;
	return 0;
}

匈牙利算法优化

点击查看代码
//匈牙利算法优化代码 
//如需优化,要用编表
//时间复杂度:最坏是O(n*边数) 
#include <bits/stdc++.h>
using namespace std;
vector<int> z[maxn];//z[i][j]代表左边第i个点和右边第j个点能不能匹配   
bool vis[maxn];//vis[i]代表右边第i个点在这一轮中有没有被请求匹配过 
int n,m,k,result[maxn],ans;//n:左边有n个点,m:右边有m个点,k:中间有k条边,result[i]代表右边第i个点和左边第result[i]个点匹配 
void add_edge(int s,int e)
{
	z[s].push_back(e); 
}
bool dfs(int i)//让左边第i个点尝试匹配,返回是否成功 
{
	for(int k=0;k<z[i].size();k++)//让左边的第i个点和右边第j个点尝试匹配 
	{
		int j=z[i][k];
		if(!vis[j])
		{
			vis[j]=true;
		    if(!result[j]||dfs(result[j]))
			{
				result[j]=i;
				return true;
			} 
		}	
	} 
	return false;
}
signed main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)
	{
		int p1,p2;
		cin>>p1>>p2;
		add_edge(p1,p2);
	} 
	for(int i=1;i<=n;i++)
	{
		memset(vis,false,sizeof(vis));
		if(dfs(i)) ans++;
	} 
	cout<<ans;
	return 0;
}

强连通分量定义在有向图,找到点边使互相能走到就构成了一个强连通分量,独立的点也可以构成一个强连通分量,找强连通分量要找环

连到自己祖先的边叫回边,反之叫做横叉边,横叉边虽然不能组成环,但能扩大一个环

tarjan

点击查看代码
//tarjan代码,能找出图中的强连通分量
#include<bits/stdc++.h>
using namespace std;
vector<int> z[maxn];
void add_edge(int s,int e)
{
	z[s].push_back(e); 
}
int num,n,m;;//当前已经 DFS了num个点 
int dfn[maxn];//dfn[i]第i个点是第几个被 DFS到的
int low[maxn];//low[i]代表从i点出发,沿着回边,树边or能扩大环的横叉边走能够走到的所有点中dfn最小的点(深度较小)
stack<int> s;//栈用来储存被DFS过,但还没有求出强连通分量的点 
bool instack[maxn];//instack[i]代表i是否在栈里面 
int cnt;//有几个强连通分量
int belong[maxn];//belong[i]表示i属于哪一个强连通分量 
void dfs(int i)//当前搜索到了i点
{
	num++;
	dfn[i]=low[i]=num;
	s.push(i);
	instack[i]=true; 
	for(int k=0;k<z[i].size();k++)
	{
		int j=z[i][k];
		if(!dfn[j])//这是一条树边
		{
			dfs(j);
			low[i]=min(low[i],low[j]);
		}
		else//非树边,这是一条回边or能扩大环的横叉边
		{
			if(instack[j])
			{
				low[i]=min(low[i],dfn[j]);//if(instack[j])low[i]=min(low[i],low[j]); 两种写法都可以 
			}
		}
	} 
	if(dfn[i]==low[i])
	{
		cnt++;//多了一个强连通分量
		while(s.top()!=i)
		{
			belong[s.top()]=cnt;
			instack[s.top()]=false;
			s.pop();
		} 
		s.pop();
		instack[i]=false;
		belong[i]=cnt;
	} 
} 
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int p1,p2;
		cin>>p1>>p2;
		add_edge(p1,p2);
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		{
			dfs(i);
		}
    }
    return 0;
}

标签:p2,连通,个点,int,编程,maxn,result,2023,集训
From: https://www.cnblogs.com/zhuyucheng929/p/17549942.html

相关文章

  • 【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块8
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • 2023 Hive 面试大纲
    先说一些废话总结一下Hive面试宝典中的要点,方便读者快速过一遍Hive面试所需要的知识点。本文请搭配Hive面试宝典来食用更美味哟┗(▔,▔)┛方便自己系统性回忆,根据*的数量来标记重要性*简单了解**熟悉掌握***需要精通Hive的介绍(*)Hive和Hadoop的关系Hive的特......
  • 编程常识
    BSD函数BSD(BerkeleySoftwareDistribution)是一个基于Unix的操作系统,它包含了一系列的系统调用和库函数。以下是一些常见的BSD函数:socket函数:用于创建一个套接字,用于网络通信。bind函数:将一个套接字绑定到一个特定的IP地址和端口号。listen函数:将一个套接字设置为监听状态,等......
  • 【2023-07-12】一举多得
    20:00世上哪有那么多坏人。有很多人只是运气不好罢了。                                                 ——贝蒂·史密斯本周日是何太的生日,如果单单只是在家里买个......
  • 数据库编程概述
    数据库编程概述PL/SQLProcedureLanguage封装了sql语句的过程语言。如何在数据库中定义过程语言。Declare声明变量;begin程序处理过程;exceptionend;--eg1:查询目标工资打印输出setserveroutputon;---开启输出declarev_namevarchar2(20);v_sal number;begin......
  • 【雕爷学编程】Arduino动手做(160)---海凌科HLK-V20离线语音模块
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题......
  • SSO2.0 24-20230712
                    ......
  • 2023.7.12
    今天又是早起的一天八点半去练车所以今天自己溜达到驾校有点热呜呜今天教练去监考他把车给我让我自己练,真的是太放心我了哈哈哈,还让我教会另一个姐姐倒车入库后来那个姐姐走了,就剩下我自己一个人练车,真的很自由,除了有点费脚没啥毛病后来又来了一位稍微年长的姐姐,很热情,我俩又......
  • 2023.7.12
    早上和平时一样没什么特别的,只是刷刷视频,有时学着做吃的,中午脑袋疼,又去诊所拿了些药,眼泪不知道为什么一直不停的流,脑袋也比平时热,医生说我是细菌感染,我很无语,但还是开了药,下午躺着睡了一下午,终于才缓了过来,起床后吃了中午没吃的饭,蛋炒饭加上泡姜,还是不错的,继续在pta上完成了一些题......
  • 2023暑假集训
    20230710I-VisitingFriend(点双/圆方树)题意多次询问两个点之间所有路径可能经过的点数,路径只需要满足起点和终点不重复经过。\(N,M,Q ≤ 5\times10^5\)题解建出圆方树,方点点权设为0,圆点点权设为1。维护一下子树和,讨论两个点的LCA是不是其中一个点两种情况,删去不可能......