## 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;
}