题意:

      给你一个无向图,和一些必须经过的点,问你从起点出发,到达所有必须经过的点再回来的最小总路径.

思路:

      因为必须经过的点的数量很小,小于等于10,全排列是 10! = 3628800 所以以每个必须经过的点为起点跑最短路,记录数值,然后全排列,枚举经过顺序,取得最小就行了..


#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm> #define N_node (100000 + 500)
#define N_edge (200000 + 1000)
#define INF 1000000000

using namespace
std; typedef struct
{
int
to ,next ,cost;
}
STAR; STAR E[N_edge];
int
list[N_node] ,tot;
int
s_x[N_node];
int
s_x2[12][N_node];
int
mk_node[12];
int
hash[N_node]; void add(int a ,int b ,int c)
{

E[++tot].to = b;
E[tot].cost = c;
E[tot].next = list[a];
list[a] = tot;
} void
SPFA(int s ,int n)
{ int
mark[N_node] = {0};
for(int
i = 0 ;i <= n ;i ++)
s_x[i] = INF;
mark[s] = 1;
s_x[s] = 0;
queue<int>q;
q.push(s);
while(!
q.empty())
{
int
xin ,tou;
tou = q.front();
q.pop();
mark[tou] = 0;
for(int
k = list[tou] ;k ;k = E[k].next)
{

xin = E[k].to;
if(
s_x[xin] > s_x[tou] + E[k].cost)
{

s_x[xin] = s_x[tou] + E[k].cost;
if(!
mark[xin])
{

mark[xin] = 1;
q.push(xin);
}
}
}
}
return ;
} int main ()
{
int
t ,n ,m ,i;
int
a ,b ,c ,s;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d" ,&n ,&m);
memset(list ,0 ,sizeof(list));
tot = 1;
for(
i = 1 ;i <= m ;i ++)
{

scanf("%d %d %d" ,&a ,&b ,&c);
a++ ,b++;
add(a ,b ,c) ,add(b ,a ,c);
}

scanf("%d" ,&s);
for(
i = 1 ;i <= s ;i ++)
{

scanf("%d" ,&mk_node[i]);
mk_node[i]++;
hash[mk_node[i]] = i;
}

mk_node[0] = 1;
for(
i = 0 ;i <= s ;i ++)
{

SPFA(mk_node[i] ,n);
for(int
j = 1 ;j <= n ;j ++)
s_x2[i][j] = s_x[j];
} int
max = 1;
for(
i = 1 ;i <= s ;i ++)
max *= i;
int
ans_min = INF;
while(
max --)
{
int
tmp = s_x2[0][mk_node[1]] + s_x2[hash[mk_node[s]]][1];
for(
i = 2 ;i <= s ;i ++)
tmp += s_x2[hash[mk_node[i-1]]][mk_node[i]];
if(
ans_min > tmp) ans_min = tmp;
next_permutation(mk_node + 1 ,mk_node + s + 1);
}

printf("%d\n" ,ans_min);
}
return
0;
}

最新文章

  1. python征程1.4(初识python)
  2. iOS 开源项目
  3. Nginx反向代理和负载均衡——个人配置
  4. VC++ MFC子对话框建立与关闭
  5. Thrift入门及Java实例演示
  6. PhoneGap API Documentation API Reference
  7. 对require.js 的使用进行总结
  8. 继承PictureBox显示GIF的自定义控件实现
  9. hdu 5611 Baby Ming and phone number(模拟)
  10. 多校第五场 归并排序+暴力矩阵乘+模拟+java大数&amp;amp;记忆化递归
  11. synchronized简介
  12. JavaWeb三大组件之一Filter知识总结
  13. Java多线程:synchronized关键字和Lock
  14. DB2常见问题
  15. S/Kademlia2007 翻译
  16. AFNetWorking上传JSON串
  17. Hadoop 新增删除节点
  18. Java基础——String类(一)
  19. 洛谷 P1144 最短路计数
  20. Java设计模式(12)迭代模式(Iterator模式)

热门文章

  1. 基于云原生DevOps服务自动化部署前端项目学习总结
  2. python flask框架详解
  3. 【RocketMQ源码分析】深入消息存储(1)
  4. SVN同步方式举例 ​​​​ FreeBSD
  5. Codeforces Round #548 C. Edgy Trees
  6. HTML5中window.postMessage,在两个页面之间的数据传递
  7. Python中面向对象的概念
  8. 初识Django(一)
  9. 【LiteOS】LiteOS任务篇-源码分析-创建任务函数
  10. 从两个模型带你了解DAOS 分布式异步对象存储