[D-OJ练习] 有向图的邻接表表示法验证程序(两种写法)

news/2024/7/15 18:53:11 标签: 深度优先, 算法, 图论, 有向图

用邻接表表示有向图,完成图的创建、图的深度优先遍历、图的广度优先遍历操作。其中图的顶点信息是字符型,图中顶点序号按字符顺序排列,边的输入按照边的顶点序号从小到大的顺序排列,如下图的边的输入顺序为0 1,0 2,0 3,1 2,1 3,2 4,3 4共七条边,邻接表的边结点采用头插法。本输入样例中所用的图如下所示:

输入描述

第一行输入两个值,第一个是图中顶点的个数,第二个是图中边的条数
第二行输入各顶点的信息,即输入每个顶点字符
第三行开始输入每条边,每条边的形式为两个顶点的序号,中间以空格隔开,输入完一条边换行

输出描述

首先输出图的顶点信息,输出完毕换行
接着输出图的邻接表,格式为首先输出第一个顶点,接着输出该顶点的所有的临界点的序号,换行,然后输出下一个顶点及邻接点,以此类推
接下来一行输出从图的第一个顶点开始进行深度优先遍历的序列,中间以空格隔开,输出完毕换行
最后一行输出从图的第一个顶点开始进行广度优先遍历的序列,中间以空格隔开,输出完毕换行

输入样例

5 7
A B C D E
0 1
0 2
0 3
1 2
1 3
2 4
3 4

输出样例

A B C D E
A 3 2 1
B 3 2 
C 4 
D 4 
E 
A D E C B 
A D C B E 

写法一:

#include<iostream>
#include<cstring>
using namespace std;

const int N = 1e5;
int n, m;
int h[N], e[N], ne[N], idx;
int st[N]; //是否已经访问过 
char ch[N];

void AddEdge(int a, int b)
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void dfs(int u)
{
	st[u] = 1;
	cout << ch[u] << ' ';
	for(int i = h[u]; i != -1; i = ne[i])
	{
		int j = e[i];
		if(!st[j]){
			dfs(j);
		}
	} 
}
void bfs(int u)
{
	int q[N];
	int front = -1, rear = -1;
	q[++rear] = u;
	st[u] = 1;
	cout << ch[u] << ' ';
	while(front != rear)
	{
		int t = q[++front];
		for(int i = h[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			if(!st[j]){
				cout << ch[j] << ' ';
				q[++rear] = j;
				st[j] = 1;
			}
		} 
	}
}
int main()
{
	cin >> n >> m;
	
	for(int i = 0; i < n; i++) cin >> ch[i];
	
	memset(h, -1, sizeof h);
	int a, b;
	for(int i = 0; i < m; i++)
	{
		cin >> a >> b;
		AddEdge(a, b);
	}
	
	for(int i = 0; i < n; i++) cout << ch[i] << ' ';
	//cout << endl;
	for(int i = 0; i < n; i++)
	{
		cout << ch[i] << ' ';
		for(int j = h[i]; j != -1; j = ne[j]){
			cout << e[j] << ' ';
		}
		//cout << endl;
	}
	
	for(int i = 0; i < n; i++)
	{
		if(!st[i])
			dfs(i);	
	} 
	//cout << endl;
	
	memset(st, 0, sizeof st); 
	for(int i = 0; i < n; i++)
	{
		if(!st[i])
			bfs(i);	
	}
	return 0;
}

写法二:

#include<iostream>
#include<cstring>
using namespace std;

const int N = 10;
int visit[N]; // 顶点是否被访问

struct ConnectNode{
	int site;
	ConnectNode* next;
};

struct HeadNode{
	char value;
	ConnectNode* firstEdge;
};

class MGraph//无向图
{
public:
    MGraph(int n, int e);
    ~MGraph(){
	}
    void DF(int x); //深度优先遍历
    void BF(int x); //广度优先遍历
    void CheckEdge();//输出边表 
 	void PrintVertex();//输出顶点
private:
    HeadNode v[N];
    int vNum, edgeNum; //顶点数, 边数
};

MGraph::MGraph(int n, int e)
{
    vNum = n, edgeNum = e;
    for(int i = 0; i < n; i++){
    	cin >> v[i].value;
        v[i].firstEdge = NULL;
	}
		
    int j,k;
    ConnectNode* p = NULL;
    for(int i = 0; i < e; i++)
    {
        cin >> j >> k;
        p = new ConnectNode;
        p->site = k;
        p->next = v[j].firstEdge;
        v[j].firstEdge = p;
    }
}

void MGraph::BF(int x){
    int Q[N];
    int front=-1, rear=-1;
 
    cout << v[x].value << ' ';
    visit[x] = 1;
    Q[++rear] = x;
    
    while(front != rear)
    {
        int t = Q[++front];
        ConnectNode* p = v[t].firstEdge;
        while(p)//邻接点全部放入队列中
        {
        	int j = p->site;
            if(!visit[j]){
                cout << v[j].value << ' ';
                visit[j] = 1;
                Q[++rear] = j;
            }
            p = p->next;
        }
    }
}

void MGraph::DF(int x){
    cout << v[x].value << ' ';
    visit[x] = 1;
 
 	ConnectNode* p = v[x].firstEdge;
    while(p)
    {
    	int j = p->site;
        if(!visit[j]){
        	DF(j);
		}
        p = p->next;
    }
}

void MGraph::CheckEdge()
{
	ConnectNode* p = NULL;
	for(int i = 0; i < vNum; i++)
	{
		cout << v[i].value << ' ';
		p = v[i].firstEdge;
		while(p)
		{
			cout << p->site << ' ';
			p = p->next;
		}
		//cout << endl;
	}			
} 

void MGraph::PrintVertex()
{
	for(int i = 0; i < vNum; i++) cout << v[i].value << ' ';
	//cout << endl;
}

int main()
{
	int n,m;
	cin >> n >> m;

	MGraph g(n, m);
	
	g.PrintVertex();

	g.CheckEdge(); 
	
	for(int i = 0; i < n; i ++) 
		if(!visit[i])
			g.DF(i);
	
	//cout << endl;
	
	memset(visit, 0, sizeof visit);
	for(int i = 0; i < n; i ++) 
		if(!visit[i])
			g.BF(i);
	return 0;
}


http://www.niftyadmin.cn/n/816626.html

相关文章

Memcached 之取模与哈希算法命中率实验

当5台memcache服务器中有一台宕机时的命中率实验。 一、php实现代码 1. config.php $server array("A" > array("host" > "127.0.0.1", "port" > 11211),"B" > array("host" > "127.0.0.1&q…

AcWing第23场周赛 4004. 传送阵 题解

4004. 传送阵 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/description/4007/ 输入样例1&#xff1a; 5 1 1 5 5 00001 11111 00111 00110 00110输出样例1&#xff1a; 10输入样例2&#xff1a; 3 1 3 3 1 010 101 010输出样例2&#xff1a; 8输入…

ElasticSearch实战:Linux日志对接Kibana

本文由云社区发表 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTFul web接口。ElasticSearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎。Elasti…

[收藏不迷路] 搜索与图论基础

目录 &#x1f320;DFS &#x1f320;BFS &#x1f320;树与图的广度优先遍历 →拓扑排序 例题: &#x1f320;最短路 &#x1f449;单源最短路(朴素Dijkstra)(一定不能存在负权边) →堆优化Dijkstra(待续...) &#x1f449;有负权边的单源最短路(bellman-ford, spfa)…

华为的项目管理沟通高手是怎样练成的

高手说话&#xff0c;可能简单几句&#xff0c;就能让对话者茅塞顿开。高手说话&#xff0c;没有华丽的词语&#xff0c;却能让与之沟通的人如沐春风。那么高手说话的功夫是如何炼成的呢?&#xff08;文末附赠超级详细的项目管理沟通计划&#xff09; 心态篇 说话沟通&#xf…

[JavaSwing练习] 第一天:JFrame,JPanel,JTabbedPane图集

有一个不错的点子(制作周期大概半个月), 这次完全想靠自己肝出来, 首先得会一种GUI, 思来想去, 那就用JavaSwing吧, 顺便把这学期的Java课设作为作品的一个小分支(日常水课设), 先熟悉几天之后会用到的JavaSwing容器/组件吧... JFrame myWindow.java import javax.swing.*; im…

linux 启动盘制作multisystem

http://www.mintos.org/skill/multisystem.html 转载于:https://www.cnblogs.com/o-v-o/p/10123372.html

web框架UI系列--MVC常用控件讲解三

InputExtention之CheckBox、TextBox、RadioButton、Hidden、Password 云微开发平台web开发框架 web框架UI系列--MVC常用控件讲解一 web框架UI系列--MVC常用控件讲解二 Html.HiddenFor(m > m.Id) ** 或者 Html.Hidden("Id")* using (Html.BeginForm("HtmlHelp…