• HDU 3790 最短路径问题


                                                      最短路径问题

    Problem Description
    给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
     
    Input
    输入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)
     
    Output
    输出 一行有两个数, 最短距离及其花费。
     
    Sample Input
    3 2 1 2 5 6 2 3 4 5 1 3 0 0
     
    Sample Output
    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 ;
    			}
    
    		}
    	}
    }
    

      

  • 相关阅读:
    pku夏令营面试
    机器学习实验一SVM分类实验
    面试相关-转载-well,yzl——持续更新
    2715:谁拿了最多奖学金-poj
    1005:I Think I Need a Houseboat-poj
    2810:完美立方-poj
    2943:小白鼠排队-poj
    rem+媒体查询---移动端 设计稿以375
    微信小程序 + mock.js 实现后台模拟及调试
    一个div 实现纸张阴影效果
  • 原文地址:https://www.cnblogs.com/20120125llcai/p/3028196.html
Copyright © 2020-2023  润新知