zoukankan      html  css  js  c++  java
  • HDU3790 最短路径问题(双重权值+spfa)

    给你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
    #include<stdio.h>
    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<cmath>
    #include<vector>
    
    #define INF 0x3f3f3f3f
    
    using namespace std;
    
    int map[1005][1005];
    int fee[1005][1005];
    int len[1005],f[1005];
    bool mark[1005];
    int N,M,s,t;
    
    void Spfa()
    {
    	memset(len,INF,sizeof(len));
    	memset(f,INF,sizeof(f));
    	queue<int>Q;
    	Q.push(s);
    	mark[s] = true;
    	map[s][s] = 0;
    	fee[s][s] = 0;
    	len[s] = f[s] = 0;
    	while(!Q.empty())
    	{
    		int mid = Q.front();
    		Q.pop();
    		mark[mid] = false;
    		for(int i=1 ; i<=N ; i++)
    		{
    			if(len[i]>len[mid]+map[mid][i])
    			{
    				len[i] = len[mid] + map[mid][i];
    				f[i] = f[mid] + fee[mid][i];
    				if(!mark[i])
    				{
    					Q.push(i);
    					mark[i] = true;
    				}
    			}
    			else if(len[i] == len[mid]+map[mid][i])
    			{
    				if(f[i]>f[mid] + fee[mid][i])f[i] = f[mid] + fee[mid][i];
    			}
    		}
    	}
    }
    
    int main()
    {
    	while(scanf("%d %d",&N,&M) && N|M)
    	{
    		memset(map,INF,sizeof(map));
    		memset(fee,INF,sizeof(fee));
    		while(M--)
    		{
    			int a,b,c,d;
    			scanf("%d %d %d %d",&a,&b,&c,&d);
    			if(a == b)continue;
    			if(map[a][b]>c)
    			{
    				map[a][b] = map[b][a] = c;
    				fee[a][b] = fee[b][a] = d;
    			}
    			else if(map[a][b] == c)
    			{
    				if(fee[a][b]>d)fee[a][b] = fee[b][a] = d;
    			}
    		}
    		scanf("%d %d",&s,&t);
    		Spfa();
    		printf("%d %d
    ",len[t],f[t]);
    	}
    	return 0;
    }
  • 相关阅读:
    Codeforces 977F
    Codeforces 219C
    Codeforces 1132
    Codeforces 660C
    Codeforces 603A
    Codeforces 777C
    Codeforces 677
    JNUOJ 1032
    Codeforces 677D
    Codeforces 835C
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514304.html
Copyright © 2011-2022 走看看