题目链接:hdu3790
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1006;
const int inf = 0xfffffff;
int map[N][N],n;
int cost[N][N];//花费
bool v[N];
int dis[N];
int val[N];
void dijstra(int s, int e)
{
int i,j;
for(i = 1; i <= n; i ++)
{
dis[i] = map[s][i];
val[i] = cost[s][i];
v[i] = false;
}
v[s] = true;
for(i = 2; i <= n; i ++)
{
int minn = inf, pos = s;
for(j = 1; j <= n; j ++)
{
if(!v[j] && dis[j] < minn)
{
minn = dis[j];
pos = j;
}
}
v[pos] = true;
for(j = 1; j <= n; j ++)
{
if(!v[j] && map[pos][j] < inf)
{
if(dis[pos] + map[pos][j] < dis[j])
{
dis[j] = dis[pos] + map[pos][j];
val[j] = val[pos] + cost[pos][j];
}
if(dis[pos] + map[pos][j] == dis[j])//扩展到j点的距离相同时,判断最小花费
{
if(val[pos] + cost[pos][j] < val[j])
val[j] = val[pos] + cost[pos][j];
}
}
}
}
printf("%d %d\n",dis[e],val[e]);
}
int main()
{
int m,x,y,a,b,i,j;
while(scanf("%d%d",&n,&m),(n||m))
{
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
map[i][j] = cost[i][j] = inf;
while(m--)//注意判断重边
{
scanf("%d%d%d%d",&x,&y,&a,&b);
if(map[x][y] > a)
{
map[x][y] = map[y][x] = a;
cost[x][y] = cost[y][x] = b;
}
if(map[x][y] == a)
cost[x][y] = cost[y][x] = min(cost[x][y],b);
}
scanf("%d%d",&x,&y);
dijstra(x,y);
}
return 0;
}
本文详细解析了HDU3790题目的解决方案,通过Dijkstra算法实现最短路径查找,并考虑了最小花费的问题。代码中包含了完整的实现细节,包括输入输出处理、图的初始化及更新等。
&spm=1001.2101.3001.5002&articleId=21224711&d=1&t=3&u=e0d9aeba09124519bd9f01052d97ef7d)
272

被折叠的 条评论
为什么被折叠?



