类似A strange lift的写法,之前一直返回RE,感觉有点不科学,数据较小。后来看discuss,居然输入还要考虑去重。
题意:略;
解析:最短路问题,但是有两种情况,因此需要根据具体情况来考虑。我采用的是构造两张图,然后在使用Dijkstra中将dis与cost放在一个结构体中,便于理解。其它就是A strange lift的一点变形
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int Max = 0xfffffff; const int maxn = 1005; struct node{ int dis, cost; }edge[ maxn ]; int mapp1[ maxn ][ maxn ], mapp2[ maxn ][ maxn ], vis[ maxn ]; int n, m, start, end, a, b, d, p; void Dijkstra( int start ){ memset( vis, 0, sizeof( vis ) ); vis[ start ] = 1; for( int i = 1; i <= n; ++i ){ edge[ i ].dis = mapp1[ start ][ i ]; edge[ i ].cost = mapp2[ start ][ i ]; } edge[ start ].dis = edge[ start ].cost = 0; for( int i = 1; i <= n; ++i ){ int tempa = Max, tempb = Max, k; for( int j = 1; j <=n; ++j ){ if( !vis[ j ] && ( ( tempa > edge[ j ].dis ) || ( ( tempa == edge[ j ].dis ) && ( tempb > edge[ j ].cost ) ) ) ){ tempa = edge[ j ].dis; tempb = edge[ k = j ].cost; } } vis[ k ] = 1; for( int j = 1; j <= n; ++j ){ if( !vis[ j ] && ( ( edge[ j ].dis > edge[ k ].dis + mapp1[ k ][ j ] ) || ( ( edge[ j ].dis == edge[ k ].dis + mapp1[ k ][ j ] ) && ( edge[ j ].cost > edge[ k ].cost + mapp2[ k ][ j ] ) ) ) ){ edge[ j ].dis = edge[ k ].dis + mapp1[ k ][ j ]; edge[ j ].cost = edge[ k ].cost + mapp2[ k ][ j ]; } } } } int main(){ while( scanf( "%d%d", &n, &m ) != EOF ){ if( !n && !m ) break; for( int i = 0; i <= n; ++i ){ edge[ i ].dis = edge[ i ].cost = Max; for( int j =0; j <= n; ++j ){ mapp1[ i ][ j ] = Max; mapp2[ i ][ j ] = Max; } } for( int i = 0; i < m; ++i ){ scanf( "%d%d%d%d", &a, &b, &d, &p ); if( ( mapp1[ a ][ b ] > d ) || ( ( mapp1[ a ][ b ] == d ) && ( mapp2[ a ][ b ] > p ) ) ){ mapp1[ a ][ b ] = mapp1[ b ][ a ] = d; mapp2[ a ][ b ] = mapp2[ b ][ a ] = p; } } scanf( "%d%d", &start, &end ); Dijkstra( start ); printf( "%d %d\n", edge[ end ].dis, edge[ end ].cost ); } return 0; }
原文地址:http://blog.csdn.net/bo_jwolf/article/details/37741573