# include<iostream>
# include<cstring>
# define inf 0x3f3f3f3f
# define nil -1
using namespace std;
const int maxn=100+5;
typedef struct arcnode{
int adjnode;
int weight;
arcnode *nextarc;
}arcnode;
typedef struct vnode{
int data;
arcnode *firstarc;
}vnode;
typedef struct graph{
vnode vertexs[maxn];
int vertexnum; //顶点数目
int edgenum; //边数目
}graph;
int pre[maxn];
int dis[maxn];
int vis[maxn];
int find(graph g,int v)
{
for(int i=0;i<g.vertexnum;i++)
{
if(g.vertexs[i].data==v)
return i;
}
}
void init(graph &g)
{
cin>>g.vertexnum>>g.edgenum;
for(int i=0;i<g.vertexnum;i++)
{
cin>>g.vertexs[i].data;
g.vertexs[i].firstarc=NULL;
}
int u,v,w;
for(int i=0;i<g.edgenum;i++)
{
cin>>u>>v>>w;
arcnode *s=new arcnode();
int index_u=find(g,u);
int index_v=find(g,v);
s->adjnode=index_v;
s->weight=w;
s->nextarc=g.vertexs[index_u].firstarc;
g.vertexs[index_u].firstarc=s;
}
}
void relax(int u,int v,int w)
{
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
pre[v]=u;
}
}
void init_signal_source(graph g,int s)
{
for(int i=0;i<g.vertexnum;i++)
{
pre[i]=nil;
dis[i]=inf;
}
dis[s]=0; //源点距离初始化为0
}
void printpath(graph g,int s,int v)
{
if(v==s)
{
cout<<g.vertexs[s].data;
}
else if(pre[v]==nil)
{
cout<<"no path from "<<g.vertexs[s].data <<"to "<<g.vertexs[v].data;
}
else {
printpath(g,s,pre[v]);
cout<<"->"<<g.vertexs[v].data;
}
}
void dijsktra(graph g,int s)
{
init_signal_source(g,s);
for(int j=1;j<g.vertexnum;j++)//其余g.vertexnum-1顶点
{
int min_dis=inf;
int min_index;
for(int i=0;i<g.vertexnum;i++) //抽取最小距离索引
{
if(!vis[i]&&dis[i]<min_dis)
{
min_dis=dis[i];
min_index=i;
}
}
vis[min_index]=1;//加入集合
arcnode *w=g.vertexs[min_index].firstarc;
while(w)
{
relax(min_index,w->adjnode,w->weight);
w=w->nextarc;
}
}
}
int main()
{
graph g;
init(g);
int v;
cin>>v;
int index_v=find(g,v);
memset(vis,0,sizeof(vis));
dijsktra(g,index_v);
for(int i=0;i<g.vertexnum;i++)
{
if(i!=index_v)
{
printpath(g,index_v,i);
if(dis[i]!=inf)
cout<<" "<<dis[i]<<endl;
else cout<<"正无穷"<<endl;
}
}
return 0;
}
dijsktra(邻接表实现,贪心算法)
最新推荐文章于 2023-11-02 19:53:02 发布