1. 程式人生 > >洞穴奶牛第一話 (Cave Cow 1, USACO 2004 Open)

洞穴奶牛第一話 (Cave Cow 1, USACO 2004 Open)

pan name code fcm esp else ext clu ans

題目大意:

技術分享

狀壓dp

#include<bits/stdc++.h>
using namespace std;
int dp[1<<15][105];
int maps[105][105],s[15];
int main()
{
    int n,m,k,ans=0,res=0;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=k;i++)
    {
        scanf("%d",&s[i]);
        if(s[i]==1) res++;
    }
    memset(maps,
63,sizeof(maps)); for(int i=1,u,v,w;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); if(maps[u][v]>w) maps[u][v]=maps[v][u]=w; } for(int i=1;i<=n;i++) maps[i][i]=0; for(int p=1;p<=n;p++) for(int i=1;i<=n;i++) for(int j=1
;j<=n;j++) if(i!=j&&j!=p) { if(maps[i][j]>99999) maps[i][j]=min(maps[i][p],maps[p][j]); else maps[i][j]=max(maps[i][j],min(maps[i][p],maps[p][j])); } int sum=(1<<k)-1; for(int i=1;i<=sum;i++)
for(int j=1;j<=k;j++) if(i&(1<<j-1)) for(int p=1;p<=k;p++) if(!(i&(1<<p-1)) && dp[i][j]<=maps[s[j]][s[p]]) dp[i|(1<<p-1)][p]=max(dp[i|(1<<p-1)][p],dp[i][j]+1); for(int i=1;i<=sum;i++) for(int j=1;j<=k;j++) if(dp[i][j]<=maps[1][s[j]]) ans=max(ans,dp[i][j]); printf("%d",ans+res); }

洞穴奶牛第一話 (Cave Cow 1, USACO 2004 Open)