设为首页 加入收藏

TOP

关于差分约束最长路和最短路(八)
2013-11-20 14:19:01 来源: 作者: 【 】 浏览:1028
Tags:关于 差分 约束 长路 短路


    最短路:
    [cpp] view plaincopyprint
    01.#include <set>
    02.#include <map>
    03.#include <stack>
    04.#include <cmath>
    05.#include <queue>
    06.#include <cstdio>
    07.#include <string>
    08.#include <vector>
    09.#include <iomanip>
    10.#include <cstring>
    11.#include <iostream>
    12.#include <algorithm>
    13.#define Max 2505
    14.#define FI first
    15.#define SE second
    16.#define ll long long
    17.#define PI acos(-1.0)
    18.#define inf 0x3fffffff
    19.#define LL(x) ( x 《 1 )
    20.#define bug puts("here")
    21.#define PII pair<int,int>
    22.#define RR(x) ( x 《 1 | 1 )
    23.#define mp(a,b) make_pair(a,b)
    24.#define mem(a,b) memset(a,b,sizeof(a))
    25.#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
    26.
    27.using namespace std ;
    28.
    29.#define N 1111
    30.vector<PII> G[N] ;
    31.int dis[N] , vis[N] ;
    32.int n , m ;
    33.queue<int>qe ;
    34.int cnt[N] ;
    35.void spfa() {
    36.    while(!qe.empty())qe.pop() ;
    37.    for (int i = 1 ; i <= n ; i ++ )dis[i] = inf , vis[i] = 1 , qe.push(i) ;
    38.    mem(cnt ,0) ;
    39.    while(!qe.empty()) {
    40.        int tp = qe.front() ;
    41.        qe.pop() ;
    42.        vis[tp] = 0 ;
    43.        if(cnt[tp] > n) {
    44.            puts("Impossible.") ;
    45.            return ;
    46.        }
    47.        int sz = G[tp].size() ;
    48.        for (int i = 0 ; i < sz ; i ++ ) {
    49.            int e = G[tp][i].FI ;
    50.            int l = G[tp][i].SE ;
    51.            if(dis[e] > dis[tp] + l) {
    52.                dis[e] = dis[tp] + l ;
    53.                if(!vis[e]) {
    54.                    vis[e] = 1 ;
    55.                    qe.push(e) ;
    56.
    57.                    cnt[e] ++ ;
    58.                }
    59.            }
    60.        }
    61.    }
    62.    int mx = inf ;
    63.    for (int i = 1 ; i <= n ; i ++ ){
    64.        mx = min(dis[i] , mx) ;
    65.//        if(dis[i] >= 1000000){
    66.//            puts("Impossible.");return ;
    67.//        }
    68.    }
    69.    for (int i = 1 ; i <= n ; i ++ ){
    70.        dis[i] -= mx - 1 ;
    71.    }
    72.    for (int i = 1 ; i <= n ; i ++ ){
    73.        if(dis[i] >= 1000000){
    74.            puts("Impossible.") ; return ;
    75.        }
    76.    }
    77.    for (int i = 1 ; i < n ; i ++ )printf("%d ",dis[i]) ;
    78.    cout 《 dis[n] 《 endl;
    79.}
    80.char a[1111][111] ;
    81.int main() {
    82.    while(cin 》 n , n) {
    83.        for (int i = 1 ; i <= n ; i ++ )G[i].clear() ;
    84.        cin 》 m ;
    85.        int s , e , l ;
    86.        for (int i = 0 ; i < m ; i ++ ) {
    87.            scanf("%s %d %s %s",a , &s , a , a ) ;
    88.            if(a [0] == 'a'){
    89.                scanf("%s %d %s %s %s %s %d",a ,&l ,a ,a ,a ,a ,&e) ;
    90.//                G[e].push_back(mp(s , l)) ;
    91.                G[s].push_back(mp(e , -l)) ;
    92.            }
    93.            else {
    94.                scanf("%d %s %s %s %s %s %s %s %d",&l ,a ,a ,a ,a ,a ,a ,a , &e) ;
    95.//                G[e].push_back(mp(s, 0)) ;
    96.//                G[s].push_back(mp(e, -l)) ;
    97.                G[e].push_back(mp(s , l)) ;
    98.                G[s].push_back(mp(e , 0)) ;
    99.            }
    100.        }
    101.        spfa() ;
    102.    }
    103.    return 0 ;
    104.}

      

首页 上一页 5 6 7 8 9 10 11 下一页 尾页 8/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇在C语言下用google protobuf 下一篇求二叉树两结点最小公共祖先

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: