N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意。

三进制状压。存储每一个状态下每一个城市经过的次数。

转移方程: dp[i+b[k]][k]=Min(dp[i+b[k]][k],dp[i][j]+dis[j][k]);

#include "stdio.h"
#include "string.h" const int inf=0x3f3f3f3f; int b[15],mark[60010][15],dp[60010][15],dis[15][15];
int Min(int a,int b)
{
if (a<b) return a;
else return b;
}
int main()
{
int i,j,n,m,k,temp,ans,flag; b[0]=1;
for (i=1; i<=10; i++)
b[i]=b[i-1]*3; for (i=0; i<b[10]; i++) // 记录每种状态下,每一个城市经过的情况。 {
temp=i;
for (j=0; j<10; j++)
{
mark[i][j]=temp%3;
temp/=3;
}
} while (scanf("%d%d",&n,&m)!=EOF)
{
memset(dis,inf,sizeof(dis));
memset(dp,inf,sizeof(dp)); while (m--)
{
scanf("%d%d%d",&i,&j,&k);
i--;
j--;
if (dis[i][j]>k)
dis[i][j]=dis[j][i]=k;
} for (i=0; i<n; i++)
dp[b[i]][i]=0;
ans=inf;
for (i=0; i<b[n]; i++)
{
flag=1;
for (j=0; j<n; j++) {
if (mark[i][j]==0) flag=0;
if (dp[i][j]==inf) continue;
for (k=0; k<n; k++)
if (k!=j && mark[i][k]<2 && dis[j][k]!=inf)
dp[i+b[k]][k]=Min(dp[i+b[k]][k],dp[i][j]+dis[j][k]);
}
if (flag==1)
for (j=0; j<n; j++)
ans=Min(ans,dp[i][j]);
}
if (ans==inf) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}

最新文章

  1. sql with(lock) 与事务
  2. poj2391,poj2455
  3. 搭建Hadoop集群 (三)
  4. HDU 1335 Basically Speaking(进制转换)
  5. 开源视频监控系统:iSpy
  6. python部署galery集群
  7. centos7 开机启动服务链接说明
  8. Java数组转List
  9. 在Hadoop集群上的Hive配置
  10. 关于EF实体类的一点思考
  11. Eclipse Unhandled event loop exception GC overhead limit exceeded
  12. Pytest运行测试用例的多种方式和调试
  13. Bootstrap3基础 img-responsive 响应式图片
  14. js调试系列: 源码定位与调试[基础篇]
  15. fastcgi协议之一:定义
  16. Atcoder Tenka1 Programmer Contest 2019题解
  17. SSH下shiro的基本使用
  18. SpringMVC 的映射
  19. js时间字符串转时间戳
  20. js_面向对象设计和行为委托设计模式

热门文章

  1. idea运行提示Error:java:无效的源发行版:1.9
  2. 【BZOJ4448】【SCOI2015】情报传递
  3. 用TamperMonkey去掉cdsn中的广告
  4. 批量删除harbor中的镜像
  5. [LeetCode] 455. 分发饼干 assign-cookies(贪心算法)
  6. 【codeforces 257D】Sum
  7. The Karplus-Strong Algorithm
  8. 收集整理的openstack java封装 api的第三方实现的选择
  9. UVA 11020 - Efficient Solutions(set)
  10. sass09