Adjacency List Dijkstra

来源:互联网 发布:淘宝图片实拍保护网址 编辑:程序博客网 时间:2024/05/17 08:44
///啊 次我一个太滚吧~#include<iostream>#include<cstring>using namespace std;struct arcnode{    int adjvex;    int weight;    arcnode *nextarc;};typedef struct vnode{    int data;    arcnode * firstarc;}Adjvex[20];struct Graph{    int vexnum, arcnum;    Adjvex vertices;};int d[100];int path[100];bool vis[100];int ss;const int inf = 65535;int LocateVex(Graph G, int u){    for(int i=0; i<G.vexnum; i++)    {        if(G.vertices[i].data == u)            return i;    }}void create_graph(Graph &G){    cin >> G.vexnum >> G.arcnum;    for(int i=0; i<G.vexnum; i++)    {        G.vertices[i].data = i;        G.vertices[i].firstarc = NULL;    }    int s;    cin >> s;    ss = LocateVex(G, s);    int u, v, w;    arcnode *p, *q;    for(int i=0; i<G.arcnum; i++)    {        cin >> u >> v >> w;        p = new arcnode;        q = new arcnode;        if(p == NULL || q == NULL)            return;        int k = LocateVex(G, u);        int kk = LocateVex(G, v);        p->weight = w;        p->adjvex = kk;        p->nextarc = G.vertices[k].firstarc;        G.vertices[k].firstarc = p;        q->weight = w;        q->adjvex = k;        q->nextarc = G.vertices[kk].firstarc;        G.vertices[kk].firstarc = q;    }}void dijkstra(Graph G){    arcnode *p;    d[ss] = 0;    vis[ss] = true;/// vis[]   编号    for(p=G.vertices[ss].firstarc; p!=NULL; p=p->nextarc)    {        int k = p->adjvex;        d[k] = p->weight;        path[k] = ss;    }    for(int i=0; i<G.vexnum-1; i++)    {        int min = inf;        int kk;        for(int j=0; j<G.vexnum; j++)        {            if(!vis[j] && min>d[j])            {                min = d[j];                kk = j;            }        }        vis[kk] = true;        for(p=G.vertices[kk].firstarc; p!=NULL; p=p->nextarc)        {            int kkk = p->adjvex;            if(!vis[kkk] && d[kkk] > d[kk]+p->weight)            {                d[kkk] = d[kk]+p->weight;                path[kkk] = kk;            }        }    }    int to;    cin >> to;    int a = LocateVex(G, to);    cout << d[a] << endl;}int main(){    memset(vis, false, sizeof(vis));    memset(path, -1, sizeof(path));    memset(d, inf, sizeof(d));    Graph G;    create_graph(G);    dijkstra(G);}/*4 510 1 31 3 11 2 10 2 12 3 302Process returned 0 (0x0)   execution time : 11.973 sPress any key to continue.*/

0 0
原创粉丝点击