// 图论算法
//
#include "stdafx.h"
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
using namespace std;
typedef struct vertex {
int v;
int Known;
int Distance;
int PreVertex;
int Weight;
vertex *next;
}vertex;
vertex *V[100]; //全局变量
/**********************
功能:创建无权邻接表
输入:顶点个数
输出:邻接表指针数组
**********************/
void createVertexNoWeight(int N)
{
vertex *q, *p;
for (int j = 0;j < N;j++)
{
int k;
cin >> k;
V[j] = new vertex;
p = V[j];
V[j]->v = j;
V[j]->Distance = 888888;
V[j]->Known = 0;
for (int i = 0;i < k;i++)
{
int temp;
cin >> temp;//第j个邻接表的顶点个数
q = new vertex;
q->v = temp-1;;
p->next = q;
p = p->next;
}
p->next = 0;
}
}
/**********************
功能:创建有权邻接表
输入:顶点个数
输出:邻接表指针数组
**********************/
void createVertexHasWeight(int N)
{
vertex *q, *p;
for (int j = 0;j < N;j++)
{
int k;
cin >> k;
V[j] = new vertex;
p = V[j];
V[j]->v = j;
V[j]->Distance = 888888;
V[j]->Known = 0;
for (int i = 0;i < k;i++)
{
int temp, weight;
cin >> temp >> weight;//第j个邻接表的顶点个数
q = new vertex;
q->v = temp - 1;
q->Weight = weight;
p->next = q;
p = p->next;
}
p->next = 0;
}
}
/**********************
功能:显示邻接表
输入:邻接表指针数组
输出:邻接表
**********************/
void printfVertex(int N)
{
vertex *p;
for (int i = 0;i < N;i++)
{
p = V[i]->next;
cout << i+1 << " ";
while (p)
{
cout << p->v<<" ";
p = p->next;
}
cout << endl;
}
}
/**********************
功能:无权最短路径算法(广度优先搜索BFS)
输入:根顶点
输出:该顶点到各个顶点的最短路径长度
**********************/
void unWeight(vertex *s)
{
queue<vertex> Q; //创建队列
vertex* w, *t;//创建缓冲顶点
w = new vertex;
t = new vertex;
s->Distance = 0;//给根顶点的距离赋值0
Q.push(*s);//入队
while (!Q.empty())//判断队列是否为空,是空的话说明每一个相关顶点都访问到了
{
*w = Q.front();//取到队首顶点
Q.pop();//队尾出队
V[w->v]->Known = 1;//给该顶点访问值赋值1
t = w->next;//取到该顶点的邻接表
while (t)//没有到底
{
if (V[t->v]->Distance == 888888)//判断是否访问
{
V[t->v]->Distance = V[w->v]->Distance + 1;//没有访问过的话,这个顶点到根顶点的距离是此邻接表的根顶点与根顶点的距离+1
Q.push(*V[t->v]);//将这个顶点入栈进行后续处理
}
t = t->next;//取这条邻接表上的下一个顶点
}
}
}
/*************测试****************/
int main()
{
int N;
cin >> N;
createVertexNoWeight(N);
printfVertex(N);
unWeight(V[2]);
for (int i = 0;i < N;i++)
cout << V[i]->Distance;
system("pause");
return 0;
}
图论------创建邻接表图,打印邻接表图,无权最短路径输出函数
最新推荐文章于 2022-10-15 18:31:50 发布