题目大意:
状压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); }
时间: 2024-10-03 21:46:34