设为首页 加入收藏

TOP

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

    这道题是长沙邀请赛的题,当时是道签到题。
    这种题还是很常见的,讲一下思路。
    首先是预处理出每个宝藏之间的距离,还有到边的距离,直接对每个宝藏进行一次SPFA就可以了。
    然后就是经典的求TSP的过程。
    #include <set>
    #include <map>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <iomanip>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define Max 2505
    #define FI first
    #define SE second
    #define ll long long
    #define PI acos(-1.0)
    #define inf 1111111111
    #define LL(x) ( x 《 1 )
    #define bug puts("here")
    #define PII pair<int,int>
    #define RR(x) ( x 《 1 | 1 )
    #define mp(a,b) make_pair(a,b)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define infA(a) for (int i = 0 ; i <= n ; ++ i)a[i] = inf ;
    #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
    using namespace std;
    inline void RD(int &ret) {
    char c;
    do {
    c = getchar();
    } while(c < '0' || c > '9') ;
    ret = c - '0';
    while((c=getchar()) >= '0' && c <= '9')
    ret = ret * 10 + ( c - '0' );
    }
    inline void OT(int a) {
    if(a >= 10)OT(a / 10) ;
    putchar(a % 10 + '0') ;
    }
    #define N 222
    #define K 15
    int Map[N][N] ;
    struct tru {
    int x ,y ;
    } tk[K] ;
    int tt ;
    int MM[K][K] ;
    int dp[1 《 K][K] ;
    int dis[N][N] ;
    bool vis[N][N] ;
    PII qe[1111111] ;
    int D[K] ;
    int n , m ;
    int mx = {0 , 0 , 1 , -1} ;
    int my = {1 , -1 , 0 , 0} ;
    int inmap(int x ,int y) {
    if(x >= 0 && x < n && y >= 0 && y < m && Map[x][y] != -1)return 1 ;
    return 0 ;
    }
    void init(int pos) {
    for (int i = 0 ; i < n ; i ++ ) {
    for (int j = 0 ; j < m ; j ++ ) {
    dis[i][j] = inf ;
    vis[i][j] = 0 ;
    }
    }
    dis[tk[pos].x][tk[pos].y] = Map[tk[pos].x][tk[pos].y] == -1 inf : 0 ;
    int h = 0 , t = 0 ;
    qe[h ++ ] = mp(tk[pos].x ,tk[pos].y) ;
    while(h > t) {
    PII tp = qe[t ++ ] ;
    vis[tp.FI][tp.SE] = 0 ;
    if(tp.FI == 0 || tp.FI == n - 1 || tp.SE == 0 || tp.SE == m - 1) {
    D[pos] = min(D[pos] , dis[tp.FI][tp.SE]) ;
    }
    for (int i = 0 ; i < 4 ; i ++ ) {
    int tx = tp.FI + mx[i] ;
    int ty = tp.SE + my[i] ;
    if(inmap(tx , ty)) {
    if(dis[tx][ty] > dis[tp.FI][tp.SE] + Map[tx][ty]) {
    dis[tx][ty] = dis[tp.FI][tp.SE] + Map[tx][ty] ;
    if(!vis[tx][ty]) {
    vis[tx][ty] = 1 ;
    qe[h ++ ] = mp(tx ,ty) ;
    }
    }
    }
    }
    }
    }
    int main() {
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin) ;
    freopen("out.txt","w",stdout) ;

   

首页 上一页 1 2 3 4 5 下一页 尾页 1/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)