• HDU3001 Travelling


    HDU3001 Travelling

    题目描述

    共有n个点,m条路径,从任意一点出发,走完所有的点,且每个点最多走两边,问最小花费

    输入输出格式

    输入格式:

    第一行行两个数,n m

    接下来m行,每行3个数,表示从u到v的花费。

    输出格式:

    一个整数,表示最少花费。如果不能走完所有点,输出-1

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int inf=1000000009;
    int map[15][15],cst[15],f[60010][15],dp[60010][15],n,m;
    void init()
    {
    	cst[0]=1;
    	for(int i=1;i<=10;i++) cst[i]=cst[i-1]*3;
    	for(int i=0;i<=cst[10];i++) 
    	{
    		int t=i;
    		for(int j=0;j<10;j++) f[i][j]=t%3,t/=3;
    	}
    }
    int main()
    {
    	init();
    	while(~scanf("%d%d",&n,&m))
    	{
    		for(int i=0;i<n;i++)
    			for(int j=0;j<n;j++)
    				map[i][j]=inf;
    		for(int i=1,x,y,z;i<=m;++i)
    		{
    			scanf("%d%d%d",&x,&y,&z),x--,y--;
    			map[y][x]=map[x][y]=min(map[x][y], z);
    		}
    		for(int i=0;i<cst[n];i++)
    			for(int j=0;j<n;j++)
    				dp[i][j]=inf;
    		for(int i=0;i<n;i++) dp[cst[i]][i]=0;
    		for(int i=0;i<cst[n];i++)
    			for(int j=0;j<n;j++)
    				if(f[i][j]&&dp[i][j]!=inf)
    					for(int k=0;k<n;k++)
    						if(j!=k&&map[j][k]!=inf&&f[i][k]!=2) dp[i+cst[k]][k]=min(dp[i+cst[k]][k],dp[i][j]+map[j][k]);
    		int ans=inf;
    		for(int i=0;i<cst[n];i++)
    			for(int j=0;j<n;j++)
    				for(int k=0;k<n;k++)
    				{
    					if(!f[i][k]) break;
    					if(k+1==n)ans=min(ans,dp[i][j]);
    				}
    		if(ans==inf) ans=-1;
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    [Typescript] 26. Medium Trim
    [Typescript] 24. Medium Type Lookup
    [Typescript] 23. Medium Promise.all
    AcWing 368. 银河
    无向图的双连通分量
    P1656 炸铁路
    T103489 【模板】边双连通分量
    AcWing 1183 电力
    T103492 【模板】点双连通分量
    AcWing 257. 关押罪犯
  • 原文地址:https://www.cnblogs.com/axma/p/10076825.html
Copyright © 2020-2023  润新知