dijkstra算法实现
#include<stdio.h>
#define MAX 900000000
typedef struct NODE
{
int dis;
int cost;
}node;
node map[1005][1005];
node d[1005];
int v[1005];
void init()
{
int i,j;
for(i=0;i<1005;i++)
for(j=0;j<1005;j++)
{
if(i==j)
{
map[i][j].dis=0;
map[i][j].cost=0;
}
else
{
map[i][j].dis=MAX;
map[i][j].cost=MAX;
}
}
for(i=0;i<1005;i++)
v[i]=0;
}
int main()
{
int m,n,i,j,a,b,from,to;
int k,pos,min;
scanf("%d%d",&n,&m);
while(n!=0)
{
init();
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
scanf("%d%d",&map[a][b].dis,&map[a][b].cost);
map[b][a]=map[a][b];
}
scanf("%d%d",&from,&to);
for(i=1;i<=n;i++)
d[i]=map[from][i];
v[from]=1;
k=n-1;
while(k--)
{
min=MAX;
for(i=1;i<=n;i++)
if(!v[i])
{
if(d[i].dis<min)
{
min=d[i].dis;
pos=i;
}
}
v[pos]=1;
for(i=1;i<=n;i++)
if(!v[i])
{
if(d[pos].dis+map[pos][i].dis<d[i].dis)
{
d[i].dis=d[pos].dis+map[pos][i].dis;
d[i].cost=d[pos].cost+map[pos][i].cost;
}else if(d[pos].dis+map[pos][i].dis==d[i].dis)
{
if(d[pos].cost+map[pos][i].cost<d[i].cost)
d[i].cost=d[pos].cost+map[pos][i].cost;
}
}
}
printf("%d %d\n",d[to].dis,d[to].cost);
scanf("%d%d",&n,&m);
}
return 0;
}