首页 > 编程语言 >算法随笔——欧拉回路

算法随笔——欧拉回路

时间:2024-08-05 09:40:10浏览次数:11  
标签:int back dfs while deg 回路 随笔 欧拉 define

学习链接
oiwiki

定义

image

判别方法

image

P7771 【模板】欧拉路径(有向图)

P7771 【模板】欧拉路径

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define re register
#define PII pair<int,int>
int read()
{
	int f=1,k=0;char c = getchar();
	while(c <'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();
	return k*f;
}

const int N = 4e5+5;

int n,m;
vector<int> v[N];
int ing[N],deg[N];

int sta[N],top;

void dfs(int u)
{
	while (v[u].size())
	{
		int j = v[u].back();
		v[u].pop_back();//将该边删除
		dfs(j); // 继续跑dfs
	}
	sta[++top] = u;
}

int main()
{
	cin >> n >> m;
	for (int i = 1;i <= m;i++) 
	{
		int x = read(),y = read();
		v[x].push_back(y);
		ing[y]++,deg[x]++;
	}
	//先进行判定
	int cnt1 = 0 ,cnt2 = 0,S = 0; // S 为起点
	for (int i = 1;i <= n;i++)
	{
		sort(v[i].begin(),v[i].end(),greater<int>()); //先取尾所以倒序排序
		if (ing[i] != deg[i])
		{
			if (abs(ing[i]-deg[i])>1) 
			{
				puts("No");
				return 0;
			}
			else if (ing[i] > deg[i]) cnt1++;
			else cnt2++,S = i;
		}
	}
	
	if (cnt1 == cnt2)
	{
		if (cnt1 == 0) S = 1;
		dfs(S);
		for (int i = top;i >= 1;i--) cout << sta[i] << ' ';
		puts("");
	}
	else puts("No");
	
	
	return 0;
}

P1341 无序字母对(无向图)

P1341

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define re register
#define PII pair<int,int>
int read()
{
	int f=1,k=0;char c = getchar();
	while(c <'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();
	return k*f;
}
const int N = 2e5;
int n;
vector<PII > v[N];
int m;
bool vis[N];
int deg[N];
void add(int x,int y,int id)
{
	v[x].push_back({y,id});
	deg[y]++;
}
vector<int> ans;
void dfs(int u)
{
	while (v[u].size())
	{
		auto j = v[u].back().first;
		auto id = v[u].back().second;
		v[u].pop_back();
		if (!vis[id])
		{
			vis[id] = 1;
			dfs(j);
		}
	}
	ans.push_back(u);
}
int main()
{
	cin >> m;
	for (int i = 1;i <= m;i++)
	{
		char ch1,ch2;
		cin >> ch1 >> ch2;
		add(ch1,ch2,i);
		add(ch2,ch1,i);
	}
	int cnt1 = 0,cnt2 = 0,S = INF;
	int minS = INF;
	for (int i = 0;i <= 200;i++) sort(v[i].begin(),v[i].end(),greater<PII>());
	for (int i = 0;i <= 200;i++)
		if (deg[i])
		{
			minS = min(minS,i);
			if (deg[i] & 1) cnt1++,S = min(S,i);
			else cnt2++;
		}
	if (cnt1==0 || cnt1 == 2)
	{
		if (!cnt1) S = minS;
		dfs(S);
		reverse(ans.begin(),ans.end());
		for (auto it:ans) cout << (char)it ;
	}
	else puts("No Solution");
	
	return 0;
}

标签:int,back,dfs,while,deg,回路,随笔,欧拉,define
From: https://www.cnblogs.com/codwarm/p/18316610

相关文章

  • 筛选质数的三个方法:1.素数判断,2埃氏法,3欧拉法。
    文章目录前言一、素数是什么?二、算法使用原理1.合数:合数除了1和它本身以外,还有其他因数。与素数相对,素数只有1和它本身两个因数,而合数则至少有三个因数。2.我们理解了合数的概念后,可以知道一个合数可以由至少三个因数构成如,6=1*2*3,说明所有素数的倍数都可以是合数,那么我......
  • AtCoder Beginner Contest 365 随笔
    擦,F假了A判断闰年B输出次大值的下标用pair排序后即可C给定一个数组\(A_n\)和整数\(M\),尝试找到一个最大的\(m\),使得:\[\sum_{i=1}^n\min(A_i,m)\leM\]不等号左边显然随着\(m\)的增大而增大,所以可以二分一个\(m\),然后判断即可D两个人玩\(n\)局剪刀石头布......
  • 2070 欧拉回路--[中等+]
    #include<iostream>usingnamespacestd;//arr记录邻接矩阵dot记录奇点(每个点连接边数量)ans数组存储结果 intarr[105][105],dot[105],n,m,ans[105];//记录奇点intstart[3],sum=0; //x正在到达的结点cnt是数组ans的下标voiddfs(intx,intcnt){   //边......
  • 如何基于欧拉系统完成数据库的安装
    一、安装当我们直接进行安装软件包时,会提示有冲突,此时,我们应该这样来解决使用rpm命令 [[email protected]]#rpm-qa|grepselinux使用rpm命令卸载以下两个软件包[[email protected]]#rpm-eselinux-policy-35.5-22.oe2203sp4.noarch--nodeps......
  • BZOJ2839/LG10596 集合计数 题解(二项式反演+扩展欧拉定理)
    题目大意:一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得它们的交集的元素个数为\(K\),求取法的方案数,答案模\(10^9+7\)。为表述方便,不妨设这\(i\)个元素分别为\(1\simn\)。前置知识:二项式反演。考虑设\(g(......
  • 2024.8.1随笔
    前言今天下午最后的时间不想写题了,于是就准备拿来随便写写什么。上午讲的是一些图论中常见的考点的应用(大概),题目难度都在蓝到紫,感觉也不是完全不可做,或多或少都能有一些想法,有时能想到点子上,但也常常乱整。今天讲了有关连通分量、欧拉路、2-sat等知识的题,其中2-sat我全部遗......
  • 随笔 招投标过程的简单汇总
    项目招标委员会构成、发布通知、资格审查、设定价格、公告信息、开标、评审中标者、签署合同。招投标是指政府部门或企事业单位为了完成工程、供货、服务等项目而公开向社会发布招标信息,接受厂商或供应商提交投标文件,并通过评标程序选取合适的供应商或承包商的过程。以下是一个......
  • 【游戏设计随笔10】解密游戏设计的30堂课
    Part1:(1)尤里卡(Eureka)时刻是谜题的基本组成部分(原子)(2)谜题与幽默是同构的(3)最大限度提高Sparkle(闪光点)(4)避开无价值的谜题(Chaff)(5)惊喜是Sparkle的重要源泉(6)有趣的事实是惊喜的源泉(7)尤里卡不是Fiero(自豪)(8)不同解谜者寻求的解谜体验是不尽相同的(9)尤里卡是可分享的(10)创造很多尤里......
  • 2024.7.31随笔
    上午讲课,学长叫wwlw,不认识,好像是20级的,比xk和watre高一级。今天讲的图论中的生成树和最短路,一共十道题左右,其中洛谷上有六道,一绿一蓝剩四紫;站外题也很难,感觉都有紫。从今天开始,我决定逼迫自己思考,压榨自己的思考力,争取多与学长互动,多提出自己的想法,然后找到自己的不足、漏......
  • 2024.7.30随笔
    关于ACM今天第一次打ACM,有点兴奋。hfu让我们就近组队,我便和jsh、JPGOJCZX两人一组。我们组配置不高,三个人都很菜,等着被薄纱。开始后随便看了一下题,C题签到直接写了,但是不小心写挂了吃了一发罚时。然后漫无目的地四处看题,不一会儿我锁定G题,它看起来似乎可做,于是我想了5min......