首页 > 代码库 > 洞穴奶牛第一话 (Cave Cow 1, USACO 2004 Open)

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

题目大意:

技术分享

 

状压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)