• [luogu3959 noip2017] 宝藏 (状压dp)


    Description

    Input

    第一行两个用空格分离的正整数 n,m ,代表宝藏屋的个数和道路数。

    接下来 m 行,每行三个用空格分离的正整数,分别是由一条道路连接的两个宝藏 屋的编号(编号为 1−n ),和这条道路的长度 v 。

    Output

    一个正整数,表示最小的总代价。

    Sample Input 1

    4 5
    1 2 1
    1 3 3
    1 4 1
    2 3 4
    3 4 1

    Sample Output 1

    4

    Sample Input 2

    4 5
    1 2 1
    1 3 3
    1 4 1
    2 3 4
    3 4 2

    Sample Output 2

    5

    HINT

    Solution

    n最大12显然状压至于思路 直接暴力枚举ヽ( ̄▽ ̄)ノ居然就过了。。
    注意:
    两点之间有重边,要取最小的 (40*1) QAQ

    有零边,要建邻接矩阵 (60*1) QAQ

    Code

    //By Menteur_Hxy
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define M(a,b) memset(a,(b),sizeof(a))
    #define F(i,a,b) for(register int i=(a);i<=(b);i++)
    using namespace std;
    typedef long long LL;
    
    int read() {
    	int x=0,f=1; char c=getchar();
    	while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
    	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
    	return x*f;
    }
    
    const int INF=0x3f3f3f3f;
    int n,m;
    int dis[15],edg[15][15],in[15][15];
    LL dp[1<<15],ans=INF; 
    
    void dfs(int x) {
    	F(i,0,n-1) if(x&(1<<i)) 
    		F(j,0,n-1) if(in[i][j] && i!=j && !(x&(1<<j))) 
    			if(dp[x|(1<<j)]>dp[x]+dis[i]*edg[i][j]) {
    				int reg=dis[j];
    				dp[x|(1<<j)]=dp[x]+dis[i]*edg[i][j];
    				dis[j]=dis[i]+1;
    				dfs(x|(1<<j));
    				dis[j]=reg;
    			}
    }
    
    int main() {
    	n=read(),m=read();
    	M(edg,0x3f);
    	F(i,1,m) {
    		int u=read()-1,v=read()-1,w=read();
    		if(w<edg[u][v]) in[u][v]=in[v][u]=1,edg[u][v]=edg[v][u]=w;
    	}
    	F(i,0,n-1) {
    		M(dis,0x3f); M(dp,0x3f);
    		dis[i]=1; dp[1<<i]=0;
    		dfs(1<<i);
    		ans=min(ans,dp[(1<<n)-1]);		
    	}
    	printf("%lld",ans);
    	return 0;
    }
    
    版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
  • 相关阅读:
    MD5双重加密设计
    ComBox(自定义封装)LimitToList属性和做到移走光标不是下拉项清空输入
    强制下线功能
    广播
    动态添加碎片
    RecyclerView
    Listview的运行效率
    Listview
    通知栏
    补间动画
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9364577.html
Copyright © 2020-2023  润新知