图论------创建邻接表图,打印邻接表图,无权最短路径输出函数

来源:互联网 发布:java多条件查询 编辑:程序博客网 时间:2024/06/07 06:03
// 图论算法//#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;}
原创粉丝点击