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

// 图论算法
//

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值