zoukankan      html  css  js  c++  java
  • 【HDOJ6664】Andy and Maze(color coding)

    题意:给定一张n点m边的无向带权图,问从任意结点出发,不能走已经经过的点,共经过k个点的最长路径的值

    n,m<=1e4,k<=6

    思路:color coding算法

     考虑每次给每个点随机编号,跑状压DP取最大值

    每次状压DP求出来的值有k!/(k^k)是合法的,因为k很小,跑不会很大的若干次就能找到合法解

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 typedef long long ll;
      4 typedef unsigned int uint;
      5 typedef unsigned long long ull;
      6 typedef pair<int,int> PII;
      7 typedef pair<ll,ll> Pll;
      8 typedef vector<int> VI;
      9 typedef vector<PII> VII;
     10 //typedef pair<ll,ll>P;
     11 #define N  10010
     12 #define M  200010
     13 #define fi first
     14 #define se second
     15 #define MP make_pair
     16 #define pb push_back
     17 #define pi acos(-1)
     18 #define mem(a,b) memset(a,b,sizeof(a))
     19 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
     20 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
     21 #define lowbit(x) x&(-x)
     22 #define Rand (rand()*(1<<16)+rand())
     23 #define id(x) ((x)<=B?(x):m-n/(x)+1)
     24 #define ls p<<1
     25 #define rs p<<1|1
     26 
     27 
     28 const int MOD=1e9+7,inv2=(MOD+1)/2;
     29       double eps=1e-4;
     30       int INF=1e9;
     31       int inf=0x7fffffff;
     32       int dx[4]={-1,1,0,0};
     33       int dy[4]={0,0,-1,1};
     34 
     35 int dp[N][1<<8],head[M],vet[M],nxt[M],len[M],c[N],tot,n,m,k;
     36 mt19937 gen(233);
     37 
     38 int read()
     39 {
     40    int v=0,f=1;
     41    char c=getchar();
     42    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
     43    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
     44    return v*f;
     45 }
     46 
     47 void add(int a,int b,int c)
     48 {
     49     nxt[++tot]=head[a];
     50     vet[tot]=b;
     51     len[tot]=c;
     52     head[a]=tot;
     53 }
     54 
     55 int solve()
     56 {
     57     rep(i,1,n) c[i]=gen()%k;
     58     int S=(1<<k)-1;
     59     rep(i,1,n)
     60      rep(j,0,S) dp[i][j]=-1;
     61     rep(i,1,n) dp[i][1<<c[i]]=0;
     62     rep(sta,0,S)
     63      rep(i,1,n)
     64       if(sta>>c[i]&1)
     65       {
     66           int e=head[i];
     67           while(e)
     68           {
     69               int v=vet[e],j=(sta^(1<<c[i]));
     70               if(dp[v][j]>=0) dp[i][sta]=max(dp[i][sta],dp[v][j]+len[e]);
     71               e=nxt[e];
     72           }
     73       }
     74 
     75     int res=0;
     76     rep(i,1,n) res=max(res,dp[i][S]);
     77     return res;
     78 }
     79 
     80 int main()
     81 {
     82     //freopen("1.in","r",stdin);
     83     int cas=read();
     84     while(cas--)
     85     {
     86         n=read(),m=read(),k=read();
     87         rep(i,1,n) head[i]=0;
     88         tot=0;
     89         rep(i,1,m)
     90         {
     91             int x=read(),y=read(),z=read();
     92             add(x,y,z);
     93             add(y,x,z);
     94         }
     95         int ans=0;
     96         int T=250;
     97         while(T--) ans=max(ans,solve());
     98         if(ans==0) printf("impossible
    ");
     99          else printf("%d
    ",ans);
    100     }
    101 
    102     return 0;
    103 }
  • 相关阅读:
    集合类型操作符
    ffmpeg 转换VC工具 V1.1.2 支持android.mk工程文件生成
    avplayer VS2008编译
    cocosBuiler使用简介&心得
    ffmpeg 转换VC工具 V1.1.2 支持android.mk工程文件生成
    ffmpeg优化
    avplayer VS2008编译
    VS2008+WDK 文件过滤驱动程序 开发环境配置
    cocosBuiler使用简介&心得
    ffmpeg优化
  • 原文地址:https://www.cnblogs.com/myx12345/p/11662706.html
Copyright © 2011-2022 走看看