您的位置:首页 > 编程语言 > PHP开发

单源最短路径问题(Dijkstra算法)第五集

2010-07-28 12:29 429 查看
//单源最短路径问题(Dijkstra算法)
//采用邻接矩阵
/*#include<stdio.h>
#include<stdlib.h>
#define N 1000
#define MAX 100
int s[MAX],dist[MAX],path[MAX];
typedef struct
{
int n,e;
int egde[MAX][MAX];
}matrix_graph;
matrix_graph *g=(matrix_graph*)malloc(sizeof(matrix_graph));
void Dijkstra(int v0)
{
int i,j,min,u;
for(i=1;i<g->n;i++)
{
min=N;
for(j=0;j<g->n;j++)
{
if(!s[j]&&dist[j]<min)
{
u=j;
min=dist[j];
}
}
s[u]=1;
for(j=0;j<g->n;j++)
{
if(!s[j]&&g->egde[u][j]<N&&g->egde[u][j]+dist[u]<dist[j])
{
dist[j]=dist[u]+g->egde[u][j];
path[j]=u;
}

}
}
return ;
}
void output(int v)
{
int i;
for(i=0;i<g->n;i++)
{
if(i!=v)
{
printf("from %d to %d dist is %d /n",v,i,dist[i]);
}
}
return ;
}
int main()
{
int i,u,v,k;
scanf("%d%d",&g->n,&g->e);
//初始化邻接矩阵
for(v=0;v<g->n;v++)
for(u=0;u<g->n;u++)
{
if(v==u)g->egde[u][v]=0;
else g->egde[u][v]=N;
}
for(i=0;i<g->e;i++)
{
scanf("%d%d%d",&u,&v,&k);
g->egde[u][v]=k;
}
scanf("%d",&v);
//初始化
for(i=0;i<g->n;i++)
{
dist[i]=g->egde[v][i];
s[i]=0;
if(i!=v&&dist[i]<N)path[i]=v;
else path[i]=-1;
}
Dijkstra(v);
output(v);
return 0;
}
*/
//采用邻接表
#include<stdio.h>
#include<stdlib.h>
#define N 100
#define MAX 10000
typedef struct node
{
int adjver,power;
struct node *next;
}egdeNode ;
typedef struct
{
int vertex;
egdeNode *link;
}vernode;
typedef struct
{
int n,e;
vernode adjlist
;
}link_graph;
int s
,dist
,path
;
void create(link_graph *ge)
{
int i,u,v,k;
egdeNode *p;
scanf("%d%d",&ge->n,&ge->e);
for(i=0;i<ge->n;i++)
{
ge->adjlist[i].vertex=i;
ge->adjlist[i].link=0;
}
for(i=0;i<ge->e;i++)
{
scanf("%d%d%d",&v,&u,&k);
p=(egdeNode*)malloc(sizeof(egdeNode));
p->adjver=u;
p->power=k;
p->next=ge->adjlist[v].link;
ge->adjlist[v].link=p;
}
}
void dijkstra(link_graph *ge,int vo)
{
int i,j,min,u;
egdeNode *p;
//初始化
for(i=0;i<ge->n;i++)
{
s[i]=0;
dist[i]=N;
path[i]=-1;
}
s[vo]=1;dist[vo]=0;
p=ge->adjlist[vo].link;
while(p)
{
dist[p->adjver]=p->power;
path[p->adjver]=1;
p=p->next;
}
for(i=1;i<ge->n;i++)
{
min=N;
for(j=0;j<ge->n;j++)
{
if(!s[j]&&dist[j]<min)
{
min=dist[j];
u=j;
}
}
s[u]=1;
p=ge->adjlist[u].link;
while(p)
{
j=p->adjver;
if(!s[j]&&dist[j]>dist[u]+p->power)
{
dist[j]=dist[u]+p->power;
path[j]=u;
}
p=p->next;
}
}
return ;
}
void output(link_graph *ge ,int vo)
{
int i;
for(i=0;i<ge->n;i++)
{
if(i!=vo)
{
printf("form %d to %d list is %d /n",vo,i,dist[i]);
}
}
return ;
}
int main()
{
int vo;
link_graph *ge=(link_graph*)malloc(sizeof(link_graph));
create(ge);
scanf("%d",&vo);
dijkstra(ge,vo);
output(ge,vo);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息