首页 > 代码库 > 洞穴奶牛第一话 (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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。