hdu3001 Travelling

Problem Description

After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice!He has decided to visit n cities(he insists on seeing all the cities!And he does not mind which city being his start station because superman can bring him to any
city at first but only once.), and of course there are m roads here,following a fee as usual.But Mr Acmer gets bored so easily that he doesn‘t want to visit a city more than twice!And he is so mean that he wants to minimize the total fee!He is lazy you see.So
he turns to you for help.

Input

There are several test cases,the first line is two intergers n(1<=n<=10) and m,which means he needs to visit n cities and there are m roads he can choose,then m lines follow,each line will include three intergers a,b and c(1<=a,b<=n),means there is a road between
a and b and the cost is of course c.Input to the End Of File.

Output

Output the minimum fee that he should pay,or -1 if he can‘t find such a route.

Sample Input

2 1
1 2 100
3 2
1 2 40
2 3 50
3 3
1 2 3
1 3 4
2 3 10

Sample Output

100
90
7 

看了别人的思路,自己写出来了:)。这题和poj3311差不多,但是不能用floyd处理,因为它有访问次数限制,最多相同的地方访问两次,至少一次,所以为了存储状态,我们可以用三进制表示,1代表访问一次,2代表访问2次。动态转移方程也和之前的差不多,为dp[s][i]=min(dp[s][i],dp[s-san[i-1]][j]+dis[j][i])。最后的结论要在访问过程中产生,如果当前所枚举的状态符合用三进制表示后每一位的数都大于0,那么就表示都访问到了,就可以和所求的结果ans比,如果比ans小就更新。
#include<stdio.h>
#include<string.h>
#define inf 88888888
int dis[15][15],dp[200000][15],wei[15],num,t;
int san[15]={1,3,9,27,81,243,729,2187,6561,19683,59049,177147};
int min(int a,int b){
	return a<b?a:b;
}
void zhuanhua(int x)
{
	int i,j;
	num=0,t=0;
	while(x>0){
		if(x%3>0)num++;
		wei[++t]=x%3;
		x=x/3;
	}
}

int main()
{
	int n,m,i,j,a,b,c,s,ans;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=1;i<=n;i++){
			for(j=1;j<=n;j++){
				dis[i][j]=inf;
			}
		}
		for(i=1;i<=m;i++){
			scanf("%d%d%d",&a,&b,&c);
		    if(dis[a][b]>c)dis[a][b]=dis[b][a]=c;
		}
		ans=inf;
		for(s=1;s<san[n+1];s++){
			for(i=1;i<=n;i++){
				dp[s][i]=inf;
			}
		}

		for(s=1;s<san[n+1];s++){
			zhuanhua(s);
			for(i=1;i<=n;i++){
				if(t>=i && wei[t]>0){
					if(s==san[i-1]){
						dp[s][i]=0;
					}
					else{
						for(j=1;j<=n;j++){
							if(j!=i && wei[j]>0){
								dp[s][i]=min(dp[s][i],dp[s-san[i-1]][j]+dis[j][i]);
								if(num==n){
									ans=min(ans,dp[s][i]);
								}
							}
						}
					}
				}
			}
			if(ans==0)break;
		}
		if(ans==inf)printf("-1\n");
		else printf("%d\n",ans);
	}
} 

时间: 2024-08-26 02:40:30

hdu3001 Travelling的相关文章

hdu3001 Travelling 旅行商问题 状态压缩DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4642    Accepted Submission(s): 1531 Problem Description After coding so many days,

hdu3001——Travelling 三进制TSP, 状态压缩

Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4106    Accepted Submission(s): 1310 Problem Description After coding so many days,Mr Acmer wants to have a good rest.So travelling is

HDU3001(KB2-J 状态压缩dp)

Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8103    Accepted Submission(s): 2642 Problem Description After coding so many days,Mr Acmer wants to have a good rest.So travelling is

hdu 3001 Travelling (bfs+状态压缩)

Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3905    Accepted Submission(s): 1234 Problem Description After coding so many days,Mr Acmer wants to have a good rest.So travelling is

URAL 1077 Travelling Tours(统计无向图中环的数目)

Travelling Tours Time limit: 1.0 secondMemory limit: 64 MB There are N cities numbered from 1 to N (1 ≤ N ≤ 200) and M two-way roads connect them. There are at most one road between two cities. In summer holiday, members of DSAP Group want to make so

Travelling

Description After coding so many days,Mr Acmer wants to have a good rest.So travelling is the best choice!He has decided to visit n cities(he insists on seeing all the cities!And he does not mind which city being his start station because superman ca

构造 - HDU 5402 Travelling Salesman Problem

Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一个n*m的迷宫,每一个格子都有一个非负整数,从迷宫的左上角(1,1)到迷宫的右下角(n,m),并且使得他走过的路径的整数之和最大,问最大和为多少以及他走的路径. analyse: 首先,因为每个格子都是非负整数,而且规定每个格子只能走一次,所以为了使和尽可能大,必定是走的格子数越多越好.这样我们就需

状压DP [HDU 3001] Travelling

Travelling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4166    Accepted Submission(s): 1339 Problem Description After coding so many days,Mr Acmer wants to have a good rest.So travelling is

Travelling and rounded pictures

First Iwant to talk about my enjoyable travelling holidays of the National Day.It is always happy when you meeting your family members after leaving them for a quite long days,obviously it's the same to me.We travel to many places like Shanghai,Nanji