提高组算法-图论学习笔记

## 2023-10-21

第一节 基本概念

           一、什么是图:点用边连起来就叫做图,是一种数据结构。

   二、图的一些定义和概念

    1、有向图:图的边有方向,只能按箭头方向从一点到另一点。

    2、无向图:图的边没有方向,可以双向。

    3、结点的度:无向图中与结点相连的边的数目。

    4、完全图:一个 n 阶的完全无向图含有 n*(n-1)/2

条边,一个 n 阶的完全有向图含有 n*(n-1) 条边。

   三、图的存储                

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void RP()
{
	long long CSP_RP=0;
	while(1) CSP_RP+=1e18;
}
int n,m,u,v;
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	vector<vector<int>> a(n,vector<int>(n,0));
	vector<vector<int>> e(n);
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		u--;
		v--;
		a[u][v]=1;
		a[v][u]=1;	
		e[u].push_back(v);
		e[v].push_back(u);
	}
	//邻接矩阵
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			cout << a[i][j] << " ";
		}
		cout << "\n";
	}
	//邻接表
	for(int i=0;i<n;i++)
	{
		cout << e[i].size() << " ";
		sort(e[i].begin(),e[i].end());
		for(int j=0;j<e[i].size();j++)
		{
			cout << e[i][j]+1 << " ";
		}
		cout << "\n";
	}
			


	return 0;
}

 

## 2023-10-22

第二节 图的遍历

        定义:
                从图中某一顶点出发系统的访问图中的所有顶点,是每个顶点恰好被访问一次,这种运算称为图的遍历。

        方法:

                为了避免重复访问某一个顶点,可以设一个标志数组 vis[i] ,未访问设为 false,否则设为 true。

        例题:

                     洛谷-图的遍历(简单版)  

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
void RP()
{
	long long CSP_RP=0;
	while(1) CSP_RP+=1e18;
}
int n,m,vis[1005],ans[1005];
vector<int> edge[1005];
inline void dfs(int now,int start)
{
	vis[now]=1;
	ans[start]=max(ans[start],now);
	for(int i=0;i<edge[now].size();i++)
	{
		if(vis[edge[now][i]]==0)
		{	
			dfs(edge[now][i],start);
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		//存边(连边)
		edge[u].push_back(v);
	}
	for(int i=1;i<=n;i++)
	{
		//注意清空vis数组
		memset(vis,0,sizeof(vis));
		//DFS遍历
		dfs(i,i);
	}
	for(int i=1;i<=n;i++)
	{
		cout << ans[i] << " ";
	}
	
	


	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值