zoukankan      html  css  js  c++  java
  • Hdu dp

    4856 这题说的是给了一个图 这个图有很多的隧道每个隧道是单向的 只能从一个入口进入从另一个入口出来 要求计算出走完这些隧道花的总时间 因为这个图是一个网格行的然后 先用bfs算出隧道的出口到每个隧道的入口的最短距离然后进行一次TSP 意思是 dp[S][v] 表 示 从 点 v 出发已经经过了 S中每个二进制表示的点然后求得了结果

    #include <iostream>
    #include <string.h>
    #include <cstdio>
    #include <queue>
    using namespace std;
    typedef pair<int,int> F;
    const int maxn =20;
    struct node{
      int fx,fy,tx,ty;
    }P[maxn];
    int x[]={0,0,1,-1};
    int y[]={1,-1,0,0};
    char map[maxn][maxn];
    int MT[maxn][maxn],N,M,dist[maxn][maxn];
    int dp[1<<16][16];
    void bfs(int xx,int yy){
       memset(MT,-1,sizeof(MT));
       queue<F> Q;
       F a;
       a.first =xx;
       a.second=yy;
       Q.push(a);
       MT[xx][yy]=0;
       while(!Q.empty()){
            F E=Q.front();
            Q.pop();
            for(int i =0;i<4; ++ i){
                 int xt=E.first+x[i];
                 int yt=E.second+y[i];
                 if( xt>0 && xt <= N && yt >0 && yt <= N && MT[xt][yt]==-1&&map[xt][yt]=='.')
                     {
                         MT[xt][yt]= MT[E.first][E.second] + 1;
                         a.first =xt;
                         a.second  =yt;
                         Q.push(a);
                     }
            }
       }
    }
    void solve(){
            for(int i = 1 ; i<M ; ++i){
                  bfs( P[i].tx, P[i].ty);
                  for(int j = 1; j<M ; ++ j)
                    if(i!=j)
                     dist[i][j]=MT[ P[j].fx ][ P[j].fy ];
                     else dist[i][j]=0;
                  dist[i][0]=dist[0][i]=0;
              }
    }
    int main()
    {
         while(scanf("%d%d",&N,&M)==2){
             memset(dist,-1,sizeof(dist));
              for(int i =1; i<= N; ++i){
                  getchar();
               for(int j =1; j<=N; ++j)
                 map[i][j] =getchar();
              }
              M++;
              for(int i =1; i<M ;++i)
                 scanf("%d%d%d%d",&P[i].fx,&P[i].fy,&P[i].tx,&P[i].ty);
              solve();
              for(int S =0; S<(1<<M); ++S)
                    fill(dp[S],dp[S]+M,90000000);
              dp[(1<<M)-1][0]=0;
              for(int S=(1<<M)-2 ; S>=0; S--){
                    for(int v=0; v<M; ++v)
                    for(int u=0; u<M; ++u){
                          if((S&(1<<u))==0&&dist[u][v]!=-1&& dp[S|1<<u][u]!=90000000){
                             dp[S][v] =min(dp[S][v],dp[S|1<<u][u]+dist[u][v]);
                          }
                    }
              }
              if(dp[0][0]!=90000000)
              printf("%d
    ",dp[0][0]);
              else printf("-1
    ");
         }
          return 0;
    }
    View Code
  • 相关阅读:
    iOS截取http/https流量
    Jenkins拾遗--第五篇-git插件填坑
    Jenkins拾遗--第三篇(用户权限管理)
    Jenkins拾遗--第四篇-适当的让构建失败
    Jenkins拾遗--第二篇(初步配置Jenkins)
    Jenkins拾遗--第一篇(安装Jenkins)
    一个测试人员的2015的回顾和2016年展望
    xcode升级导致git无法使用
    在intellj idea下用sbt的坑
    本人已转战知乎,此处不玩了。
  • 原文地址:https://www.cnblogs.com/Opaser/p/3835127.html
Copyright © 2011-2022 走看看