您的位置:首页 > 其它

hdu 3790 最短路径问题

2014-02-21 23:52 183 查看
点击打开链接

中文题,此题在短路径的基础上加入了一个新的条件(即花销)用于在最短路径相同时,比较花销最少的选择之,还算是一道比较基础的最短路径利用。Dijkstra算法

 

代码如下:

#include <stdio.h>
#include <string.h>

#define max 100000000
int min[1010], cost[1010], visit[1010];

struct node
{
int d;////长度  d
int p;////话费  p
}map[1010][1010];

int n, m;
void Init()
{
int i, j;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
map[i][j].d = max;
map[j][i].p = max;
}
}

void Dijkstra(int start)
{
int i, tmin, j, temp;
memset(visit, 0, sizeof(visit));
for(i=1; i<=n; i++)
{
min[i] = map[start][i].d;
cost[i] = map[start][i].p;
}
visit[start] = 1;
min[start] = cost[start] = 0;
for(i=1; i<n; i++)
{
tmin = max;
for(j=1; j<=n; j++)
{
if(!visit[j] && tmin>min[j])
{
temp = j;
tmin = min[j];
}
}
if(tmin == max)
break;
visit[temp] = 1;
for(j=1; j<=n; j++)
{
if(!visit[j] && min[j]>min[temp] + map[temp][j].d)
{
min[j] = min[temp] + map[temp][j].d;
cost[j] = cost[temp] + map[temp][j].p;
}
else if(!visit[j] && min[j] == min[temp] + map[temp][j].d)////////加入了这个条件
{
if(cost[j] > cost[temp] + map[temp][j].p)
cost[j] = cost[temp] + map[temp][j].p;
}
}
}
}

int main()
{
int a, b, d, p;
int start, end;
while(~scanf("%d%d", &n, &m))
{
if(n==0&&m==0)
break;
Init();
for(int i=1; i<=m; i++)
{
scanf("%d%d%d%d", &a, &b, &d, &p);
if(map[a][b].d > d)
{
map[a][b].d = map[b][a].d = d;
map[a][b].p = map[b][a].p = p;
}
}
scanf("%d%d", &start, &end);
Dijkstra(start);
printf("%d %d\n", min[end], cost[end]);
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: