您的位置:首页 > 其它

HDU 3790 最短路径问题

2013-04-18 12:57 253 查看
最短路径问题

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

[align=left]Input[/align]
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。 (1<n<=1000, 0<m<100000, s != t)

[align=left]Output[/align]
输出 一行有两个数, 最短距离及其花费。

[align=left]Sample Input[/align]

3 2 1 2 5 6 2 3 4 5 1 3 0 0

[align=left]Sample Output[/align]

9 11
daima:

#include<cstdio>
#include<iostream>
using namespace std ;
#define M 1010
#define INF 12000008
bool vi[M] ;
struct node{ int len , va ; }map[M][M] ;
int d[M] , n ,  m ;
int di[M] ; // 最小花费
void in()  ;
void dfs( int s , int e ){
int min , i , j , now ;
for( i = 1 ; i <= n ;i++){
if( i == s ) di[s] = 0 , d[s] = 0 ;
else di[i] = INF ;
}
for( j = 1 ; j <= n ;j++){
min = INF ;
for( i = 1 ; i <= n ;i++)
if( min > di[i] && vi[i] == 0 )
{
now = i ;
min = di[i] ;
}
//cout << now << endl ;
vi[now] = 1;
if( now == e ) return ;
for( i = 1 ;i <= n ;i++)
if( map[i][now].len != INF && di[i] >= map[now][i].len + di[now] && vi[i] == 0 ){

if( di[i] == map[now][i].len + di[now] && d[i] > d[now] + map[now][i].va )
d[i] = d[now] + map[now][i].va ; // 路程相同 修改 花费值

else { // 最短路算法
di[i] = map[now][i].len + di[now] ;
d[i] = d[now] + map[now][i].va  ;
}
// cout << d[i] << endl ;
}
}
}
int main()
{
int s , e , i , j ;
while( cin >> n >> m){
if( n == 0 && m == 0 ) break ;
for( i = 1 ; i<= n ;i++){
for( j = 1 ; j <= n ;j++){
map[i][j].len = INF ;
map[i][j].va = INF ;
}
d[i] = INF ;
}
in() ;
memset( vi , 0 , sizeof(vi) ) ;
cin >> s >> e ;
dfs( s , e ) ;
cout << di[e] << " " << d[e] << endl ;
}
}
void in()
{
int i , s, e , len , va  ;
for( i = 1 ; i <= m ; i++){ // 输入注意重边的处理
scanf( "%d%d%d%d" , &s , &e , &len , &va ) ;
if( map[s][e].len  >= len ){
if( len == map[s][e].len && va < map[s][e].va )
map[s][e].va = map[e][s].va = va ;
else {
map[s][e].len = map[e][s].len = len ;
map[s][e].va = map[e][s].va = va ;
}

}
}
}


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