社区讨论
求大佬帮忙看看怎么剪枝优化
P3959[NOIP 2017 提高组] 宝藏参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi7rgehm
- 此快照首次捕获于
- 2025/11/21 02:24 4 个月前
- 此快照最后确认于
- 2025/11/21 02:24 4 个月前
C
#include<bits/stdc++.h>
#define M 15
#define inf 1000000000
using namespace std;
int eval[M][M];
int dp[1<<13];
int n,ans,dep[M];
//int min(int a,int b){return a<b?a:b;}
int read()
{
int x=0;
char ch=getchar();
while(ch<'0' || ch>'9') ch=getchar();
while(ch>='0' && ch<='9')
{
x=10*x+ch-'0';
ch=getchar();
}
return x;
}
void init()
{
freopen("input.txt","r",stdin);
}
void dfs(int step,int cost)
{
if(cost>ans)return;
if(step==n)
{
ans=cost;
return;
}
for(int i=1;i<=n;i++)
{
if(dep[i]==0)
{
for(int j=1;j<=n;j++)
{
if(dep[j]==0||eval[j][i]==inf)continue;
dep[i]=dep[j]+1;
dfs(step+1,cost+dep[j]*eval[j][i]);
}
dep[i]=0;
}
}
}
void readdata()
{
int m,a,b,c;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) eval[i][j]=inf;
while(m--)
{
scanf("%d %d %d",&a,&b,&c);
eval[a][b]=min(eval[a][b],c);
eval[b][a]=min(eval[b][a],c);
}
ans=inf;
memset(dep,0,sizeof(dep));
}
void work()
{
for(int i=1;i<=n;i++)
{
dep[i]=1;
dfs(1,0);
dep[i]=0;
}
printf("%d\n",ans);
}
int main()
{
// init();
readdata();
work();
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...