NOIp2017 D2T2 宝藏
程序员文章站
2024-03-20 12:51:28
...
状态压缩。一个状态中,的二进制第位表示号点是否可达。然后按照题意转移一下就可以了。
#include<bits/stdc++.h>
using namespace std;
int dp[1<<13],dis[15],mp[15][15],ismp[15][15],n,m,u,v,w,ans=1<<30;
inline int read(){
int x=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x;
}
void dfs(int x){
for(int i=1;i<=n;++i)if((1<<(i-1))&x){
for(int j=1;j<=n;++j) if(!(1<<(j-1)&x)&&ismp[i][j]){
if(dp[(1<<(j-1))|x]>dp[x]+dis[i]*mp[i][j]){
dp[(1<<(j-1))|x]=dp[x]+dis[i]*mp[i][j];
int tmp=dis[j];
dis[j]=dis[i]+1;
dfs((1<<(j-1))|x);
dis[j]=tmp;
}
}
}
}
int main(){
n=read(),m=read();
memset(mp,0x3f,sizeof(mp));
for(int i=1;i<=m;++i){
u=read(),v=read(),w=read();
mp[v][u]=mp[u][v]=min(mp[u][v],w);
ismp[u][v]=ismp[v][u]=1;
}
for(int i=1;i<=n;++i){
memset(dis,0x3f,sizeof(dis));
memset(dp,0x3f,sizeof(dp));
dis[i]=1,dp[(1<<(i-1))]=0;
dfs(1<<(i-1));
ans=min(ans,dp[(1<<n)-1]);
}
cout<<ans<<'\n';
}
上一篇: 数字在排序数组中出现的次数(Java)
下一篇: zufeoj_二分法求函数的零点