【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 }
null