链式前向星

个人理解:把同起点的每条边用next链起来,head数组存每个起点的最后一条加入的边的编号
链式前向星用了单链表头插法的思想,所以在遍历一个点连接的边的时候,先加入的边后访问。
自行画图理解

#include <bits/stdc++.h>
using namespace std;
struct edge{
	int to;		//该边指向的点
	int next;	//以u为起点的上一条边的编号
	int w;		//权值
}e[500];
int cnt = 0;	//边的编号
int head[500];
int vis[500]={0};
void add(int u, int v, int w){
	e[cnt].to = v;
	e[cnt].w = w;
	e[cnt].next = head[u];	//以u为起点的上一条边的编号;
	head[u] = cnt++;		//以u为起点的最后一条边的编号;
}
void dfs(int u){		//dfs遍历图
	if(vis[u] == 0){
		cout<<u<<endl;
	}
	vis[u] = 1;
	for(int i = head[u]; i != -1; i = e[i].next){
		if(vis[e[i].to]==0){
			dfs(e[i].to);
		}
	}
}
void bfs(int x){	//bfs遍历图
	queue<int> q;
	q.push(x);
	if(vis[x] == 0) cout<<x<<" ";
	vis[x] = 1;
	while(!q.empty()){
		int u = q.front();
		q.pop();
		for(int i = head[u]; i != -1; i = e[i].next){
			int v = e[i].to;
			if(vis[v] == 0){
				cout<<v<<" ";
				vis[v] = 1;
				q.push(v);
			}
		}
	}
}
int main(){
	memset(head,-1,sizeof(head));
	int n,m;
	cin>>n>>m;
	for(int i = 0; i < m; i ++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}

	memset(vis,0,sizeof(vis));
	for(int i = 1; i <= n; i ++){
		if(head[i] != -1 && vis[i]==0)
			dfs(i);
	}
	cout<<endl;

	memset(vis,0,sizeof(vis));
	for(int i = 1; i <= n; i ++){			
		if(head[i] = -1 && vis[i] == 0){
			bfs(i);
		}
	}
	cout<<endl;

	return 0;
}

你可能感兴趣的:(图)