程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3001 Travelling (三進制狀態壓縮 DP)

HDU 3001 Travelling (三進制狀態壓縮 DP)

編輯:C++入門知識

HDU 3001 Travelling (三進制狀態壓縮 DP)




題意:有 n 個city,可以選擇任一城市作為起點,每個城市不能訪問超過2次,


城市之間有權值,問訪問全部n個城市需要的最小權值。



思路:因為每個城市可以訪問最多兩次,所以用三進制表示訪問的狀態。


詳細見代碼注釋!!!!



#include
#include
#include
#include
#include
#include
#include
#include 
#include 
#include
#include
using namespace std;
#define INF 1e8
#define inf 0x3f3f3f3f
#define eps 1e-8
#define LL long long
#define N 100001
#define mol 100000000

int dp[60000][15];//dp[i][j] 表示在狀態 i 的情況訪問到 j 的最小值
int g[15][15];
int n,m;
int st[60000][11];//dp[i][j] i 狀態的第 j 個城市可以訪問幾次
int bit[12];//初始所有可能狀態
int main()
{
	bit[0]=0;bit[1]=1;
	for(int i=2;i<=11;i++)
		bit[i]=3*bit[i-1];
	for(int i=0;i<59050;i++)
	{
		int t=i;
		for(int j=1;j<=10&&t;j++)
		{
			st[i][j]=t%3;
			t/=3;
		}
	}
	while(~scanf("%d%d",&n,&m))
	{
		int u,v,c;
		memset(dp,0x3f,sizeof(dp));
		memset(g,0x3f,sizeof(g));
		for(int i=0;i<=n;i++)
			dp[bit[i]][i]=0;//初始起點 為0
		while(m--)
		{
			scanf("%d%d%d",&u,&v,&c);
			if(c


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved