题意:RT,单源最短路问题,求路径最短,当路径长相同时使花费尽可能少。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790
SPFA/dijkstra模板即可
//cpp
//2014.09.19 18:05
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
struct node{
int en;
int len;
int val;
}adj[1005][1005];
int path[1005];
int val[1005];
int len[1005];
int SPFA ( int be, int en, int n )
{
queue<int> p;
p.push ( be );
int tmp;
while ( ! p.empty() )
{
tmp = p.front(); p.pop();
for ( int i = 0; i < len[tmp]; i ++ )
{
if ( path[adj[tmp][i].en] > path[tmp] + adj[tmp][i].len )
{
path[adj[tmp][i].en] = path[tmp] + adj[tmp][i].len;
val[adj[tmp][i].en] = val[tmp] + adj[tmp][i].val;
p.push( adj[tmp][i].en );
}
else if ( path[adj[tmp][i].en] == path[tmp] + adj[tmp][i].len )
{
if ( val[adj[tmp][i].en] > val[tmp] + adj[tmp][i].val )
{
path[adj[tmp][i].en] = path[tmp] + adj[tmp][i].len;
val[adj[tmp][i].en] = val[tmp] + adj[tmp][i].val;
p.push( adj[tmp][i].en );
}
}
}
}
}
int main()
{
ios::sync_with_stdio( false );
int m, n;
while ( cin >> n >> m )
{
if ( ! m && ! n )
{
break;
}
int a, b, p, d;
memset ( len, 0, sizeof ( len ) );
memset ( adj, 0, sizeof ( adj ) );
memset ( path, 0x3f3f3f3f, sizeof ( path ) );
memset ( val, 0x3f3f3f3f, sizeof ( val ) );
for ( int i = 0; i < m; i ++ )
{
cin >> a >> b >> d >> p;
adj[a][len[a]].en = b;
adj[a][len[a]].len = d;
adj[a][len[a]].val = p;
len[a] ++;
adj[b][len[b]].en = a;
adj[b][len[b]].len = d;
adj[b][len[b]].val = p;
len[b] ++;
}
int be, en;
cin >> be >> en;
path[be] = val[be] = 0;
SPFA ( be, en, n );
cout << path[en] << ' ' << val[en] << endl;
}
return 0;
}