#ifndef MAPIMPLEMENT_H_INCLUDED
#define MAPIMPLEMENT_H_INCLUDED
#include<iostream>
#include<new>
#define MaxVertexNum 100
#define INFINITY 65535
using namespace std;
typedef struct node{ /* 边表结点 */
int AdjV; /* 邻接点域 */
struct node *Next; /* 指向下一个邻接点的指针域 */
int weight; /*表示边上的权值*/
/* 若要表示边上的权值信息,则应增加一个数据域Weight */
} EdgeNode;
typedef char VertexType; /* 顶点用字符表示 */
typedef struct Vnode{ /* 顶点表结点 */
VertexType Vertex; /* 顶点域 */
EdgeNode *FirstEdge; /* 边表头指针 */
} VertexNode;
//typedef VertexNode AdjList[MaxVertexNum]; /* AdjList是邻接表类型 */
typedef struct{
VertexNode adjlist[MaxVertexNum]; /* 邻接表 */
int n, e; /* 顶点数和边数 */
} ALGraph; /*ALGraph是以邻接表方式存储的图类型 */
void CreateALGraph( ALGraph *G )
{
int i, j, k, w;
EdgeNode *edge;
cout<< "请输入顶点数和边数(输入格式为:顶点数,边数):"<<endl;
cin>>G->n>>G->e;
cout<<"请输入顶点信息(输入格式为:顶点号<CR>:"<<endl;
for ( i=0; i < G->n; i++ ) { /* 建立有n个顶点的顶点表 */
cin>>G->adjlist[i].Vertex; /* 读入顶点信息 */
G->adjlist[i].FirstEdge = NULL; /* 顶点的边表头指针设为空 */
}
cout<<"请输入边的信息(输入格式为: i, j, w <CR>):"<<endl;
for ( k=0; k < G->e; k++ ){ /* 建立边表 */
cin>>i>>j>>w; /* 读入边<vi,vj>的顶点对应序号*/
edge = new EdgeNode; /* 生成新边结点edge */
edge->AdjV = j;/* 邻接点序号为j */
edge->weight = w;
edge->Next = G->adjlist[i].FirstEdge;
/* 将新边表结点edge插入到顶点vi的边表头部 */
G->adjlist[i].FirstEdge = edge;
/* 若是无向图,还要生成一个结点,用来表示边< vj, vi> */
edge = new EdgeNode;
edge->AdjV = i;
edge->Next = G->adjlist[j].FirstEdge;
edge->weight = w;
G->adjlist[j].FirstEdge = edge;
}
}
void Dijkstra(int s,int k,ALGraph *G)
{
int j, t ,p;
int path[G->n];
int dist[G->n];
for(int i=0;i<G->n;i++)
dist[i]=INFINITY;
for(EdgeNode *w=G->adjlist[s].FirstEdge;w!=NULL;w=w->Next)
{
dist[w->AdjV]=w->weight;
}//初始化各顶点到源点的距离
dist[s]=0;
for(int i=0;i<G->n;i++)
{
if(dist[i]==INFINITY)
path[i]=-1;
else
path[i]=s;
}
path[s]=-2;
bool collected[G->n]={0};
while(1)
{
t=INT_MAX;
j=-1;
for(int i=0;i<G->n;i++)
{
if(collected[i]==false&&dist[i]<t)
{
t=dist[i];
j=i;
}
}
if(j==-1)
break;
collected[j]=true;
for(EdgeNode *w=G->adjlist[j].FirstEdge;w!=NULL;w=w->Next)
{
p=w->AdjV;//邻接点的下标
if(dist[p]>dist[j]+w->weight)
dist[p]=dist[j]+w->weight;
path[p]=j;
}
}
}