【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\n");
 99          else printf("%d\n",ans);
100     }
101 
102     return 0;
103 }

 

posted on 2019-10-12 17:08  myx12345  阅读(216)  评论(0编辑  收藏  举报

导航