///啊 次我一个太滚吧~
#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 5
1
0 1 3
1 3 1
1 2 1
0 2 1
2 3 3
0
2
Process returned 0 (0x0) execution time : 11.973 s
Press any key to continue.
*/
Adjacency List Dijkstra
最新推荐文章于 2021-07-21 16:54:08 发布