您的位置:首页 > 其它

九度oj 1008 最短路径

2016-09-07 14:32 232 查看
题目描述:

给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

输入:

输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。n大于1且小于等于1000,m大于1且小于等于100000,s不等于t。

输出:

输出 一行有两个数, 最短距离及其花费。

样例输入:

3 2

1 2 5 6

2 3 4 5

1 3

0 0

样例输出:

9 11

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10000000

int map[1010][1010];
int cost[1010][1010];
int visit[1010];
int dis[1010]; //从起点到各点的距离
int cos[1010]; //从起点到各点的花费
int n,m;

void dijkstra(int start,int end)
{
memset(visit,0,sizeof(visit));
int k;
int i,j;
for(i=1;i<=n;i++)
{
dis[i] = map[start][i];
}
for(i=1;i<=n;i++)
{
cos[i] = cost[start][i];
}
for(i=1;i<=n;i++)
{
int temp = MAX;
k=0;
for(j=1;j<=n;j++) //找到一个距离起点最近的点
{
if(!visit[j] && dis[j]<temp)
{
temp = dis[j];
k = j;
}
}
visit[k] = 1;
for(j=1;j<=n;j++)
{
if(!visit[j] && dis[j] > (dis[k] + map[k][j]))   //如果不是已经找到的距离起点最近的点
{
dis[j] = dis[k]+map[k][j];
cos[j] = cos[k]+cost[k][j];
}
else if(!visit[j] && dis[j] == (dis[k] + map[k][j]))
{
if(cos[j] > cos[k]+cost[k][j])
{
cos[j] =cos[k] + cost[k][j];
}
}
}
}
//  printf  ("min_len=%d,min_cost=%d\n",dis[end],cos[end]);
printf("%d %d\n",dis[end],cos[end]);
}

int main()
{
int i,j;
//  int n,m;
int a,b,d,p;
int start,end;
while(scanf("%d%d",&n,&m) != EOF)
{
if(n==0)break;
for(i=1;i<=n;i++)    //初始化
{
for(j=1;j<=n;j++)
{
map[i][j] = MAX;
cost[i][j] = MAX;
}
}
for(i=0;i<m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
map[a][b] = map[b][a] = d;
cost[a][b] = cost[b][a] = p;
}
scanf("%d%d",&start,&end);
dijkstra(start,end);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: