设为首页 加入收藏

TOP

对每个宝藏进行一次SPFA(二)
2013-12-05 13:05:37 来源: 作者: 【 】 浏览:285
Tags:每个 宝藏 进行 一次 SPFA


    #endif
    int T ;
    cin 》 T ;
    while ( T -- ) {
    cin 》 n 》 m ;
    REP(i , 0, n - 1 ) {
    REP(j , 0 , m - 1)scanf("%d",&Map[i][j]) ;
    }
    cin 》 tt ;
    REP(i , 0 , tt - 1) {
    RD(tk[i].x) ;
    RD(tk[i].y) ;
    }
    REP(i , 0 , tt - 1) {
    REP(j , 0 , tt - 1) {
    MM[i][j] = inf ;
    }
    MM[i][i] = 0 ;
    D[i] = inf ;
    }
    for (int i = 0 ; i < (1 《 tt) ; i ++ ) {
    for (int j = 0 ; j < tt ; j ++ )dp[i][j] = inf ;
    }
    REP(i , 0 , tt - 1) {
    init(i) ;
    REP(j , 0 , tt - 1) {
    if(i == j)continue ;
    MM[i][j] = min(MM[i][j] , dis[tk[j].x][tk[j].y]) ;//宝藏到宝藏之间的最近距离
    }
    dp[1 《 i][i] = D[i] + Map[tk[i].x][tk[i].y] ;//该宝藏到达边的最近距离
    }
    for (int i = 0 ; i < 1 《 tt ; i ++ ) {
    for (int j = 0 ; j < tt ; j ++ ) {
    if(i & (1 《 j) == 0)continue ;
    if(dp[i][j] == inf)continue ;
    for (int k = 0 ; k < tt ; k ++ ) {
    if(i & (1 《 k))continue ;
    int tp = i | (1 《 k) ;
    dp[tp][k] = min(dp[tp][k] , dp[i][j] + MM[j][k]) ;
    }
    }
    }
    int ans = inf ;
    for (int i = 0 ; i < tt ; i ++ ) {
    ans = min(ans , dp[(1 《 tt) - 1][i] + D[i] ) ;
    }
    cout 《 ans 《 endl;
    }
    return 0 ;
    }
    /*
    5
    4 4
    3 3 3 3
    3 -1 -1 -1
    3 -1 3 3
    3 -1 -1 -1
    1
    2 2
    5 5
    1 1 1 1 1
    1 -1 -1 -1 -1
    1 -1 -1 -1 -1
    1 -1 -1 -1 -1
    1 -1 -1 -1 -1
    2
    4 0
    0 4
    3 3
    3 2 3
    5 4 3
    1 4 2
    1
    1 1
    3 3
    3 2 3
    5 4 3
    1 4 2
    2
    1 1
    2 2
    */

      

首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于状压DP的一道题 下一篇王子选公主结婚POJ问题

评论

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

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)