Shopping

Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 632 Accepted Submission(s): 209

Problem Description

You have just moved into a new apartment and have a long list of items you need to buy. Unfortunately, to buy this many items requires going to many different stores. You would like to minimize the amount of driving necessary to buy all the items you need.

Your city is organized as a set of intersections connected by roads. Your house and every store is located at some intersection. Your task is to find the shortest route that begins at your house, visits all the stores that you need to shop at, and returns to your house.

Input

The first line of input contains a single integer, the number of test cases to follow. Each test case begins with a line containing two integers N and M, the number of intersections and roads in the city, respectively. Each of these integers is between 1 and 100000, inclusive. The intersections are numbered from 0 to N-1. Your house is at the intersection numbered 0. M lines follow, each containing three integers X, Y, and D, indicating that the intersections X and Y are connected by a bidirectional road of length D. The following line contains a single integer S, the number of stores you need to visit, which is between 1 and ten, inclusive. The subsequent S lines each contain one integer indicating the intersection at which each store is located. It is possible to reach all of the stores from your house.

Output

For each test case, output a line containing a single integer, the length of the shortest possible shopping trip from your house, visiting all the stores, and returning to your house.

Sample Input

1

4 6

0 1 1

1 2 1

2 3 1

3 0 1

0 2 5

1 3 5

3

1

2

3

Sample Output

4

Source

University of Waterloo Local Contest 2010.07.10

思路:给你一个无向图,求从0号点开始遍历所有的指定点再回到0号点的最短路径,指定点只有10个,所以先spfa后dfs即可;

#include <iostream>
#include <set>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std; const int MAX=101000; const int INF = 0x3f3f3f3f; typedef struct node
{
int v;
int w;
int next;
}Edge;
int Head[MAX];
Edge Line[MAX*2];
int top;
int n,m,s,Map[15][15];
int dis[12][MAX],num[15];
bool vis[MAX];
bool vist[15];
void AddEdge(int u,int v,int w)//由于点的个数比较多,所以采用领接表的形式
{
Line[top].v=v;
Line[top].w=w;
Line[top].next=Head[u];
Head[u]=top++;
}
void spfa(int s,int site)//spfa计算出要去的商店之间的距离
{
memset(vis,false,sizeof(false));
for(int i=0;i<=n;i++)
{
dis[site][i]=INF;
}
dis[site][s]=0;
vis[s]=true;
queue<int>Q;
Q.push(s);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=Head[u];i!=-1;i=Line[i].next)
{
if(dis[site][Line[i].v]>dis[site][u]+Line[i].w)
{
dis[site][Line[i].v]=dis[site][u]+Line[i].w;
if(!vis[Line[i].v])
{
Q.push(Line[i].v);
vis[Line[i].v]=true;
}
}
}
vis[u]=false;
}
}
int dfs(int st,int sum,int num)//搜索出最小的距离
{
vist[st]=true;
if(st==0)
{
if(num==s+1)
{
return sum;
}
else
{
return INF;
}
}
int ans=INF;
for(int i=0;i<=s;i++)
{
if(!vist[i]||i==0)
{
ans=min(ans,dfs(i,sum+Map[st][i],num+1));
}
}
vist[st]=false;
return ans;
} int main()
{
int T;
int u,v,w;
scanf("%d",&T);
while(T--)
{
memset(Head,-1,sizeof(Head));
scanf("%d %d",&n,&m);
top=0;
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&u,&v,&w);
AddEdge(u,v,w);
AddEdge(v,u,w);
}
num[0]=0;
spfa(0,0);
scanf("%d",&s);
for(int i=1;i<=s;i++)
{
scanf("%d",&num[i]);
spfa(num[i],i);
}
memset(Map,0,sizeof(Map));
for(int i=0;i<=s;i++)//离散化,由于要去的点比较少,可以将要去的点重新进行建图
{
for(int j=0;j<=s;j++)
{
Map[i][j]=dis[i][num[j]];
}
}
int ans=INF;
for(int i=1;i<=s;i++)
{
memset(vist,false,sizeof(vist));
vist[0]=true;
ans=min(ans,dfs(i,Map[0][i],1));
}
printf("%d\n",ans);
}
return 0;
}

Shopping(SPFA+DFS HDU3768)的更多相关文章

  1. 【PAT甲级】1003 Emergency (25 分)(SPFA,DFS)

    题意:n个点,m条双向边,每条边给出通过用时,每个点给出点上的人数,给出起点终点,求不同的最短路的数量以及最短路上最多能通过多少人.(N<=500) AAAAAccepted code: #in ...

  2. 【PAT甲级】1030 Travel Plan (30 分)(SPFA,DFS)

    题意: 输入N,M,S,D(N,M<=500,0<S,D<N),接下来M行输入一条边的起点,终点,通过时间和通过花费.求花费最小的最短路,输入这条路径包含起点终点,通过时间和通过花费 ...

  3. 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)

    题意: 输入四个正整数C,N,S,M(c<=100,n<=500),分别表示每个自行车站的最大容量,车站个数,此次行动的终点站以及接下来的M行输入即通路.接下来输入一行N个正整数表示每个自 ...

  4. POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]

    Sightseeing Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9703   Accepted: 3299 ...

  5. PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)

    L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...

  6. PAT (Advanced Level) Practise 1003 Emergency(SPFA+DFS)

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  7. POJ 3411 Paid Roads(SPFA || DFS)

    题目链接 题意 : 要从1城市到n城市,求最短路是多少,从a城市到达b城市的路程,如果你到过c城市,则需要走p,否则走r长. 思路 : 因为可以来回走,所以不能用单纯的最短路,可以用二维SPFA,状态 ...

  8. hdu1428之spfa+dfs

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. Key Vertex (hdu 3313 SPFA+DFS 求起点到终点路径上的割点)

    Key Vertex Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

随机推荐

  1. Java基础之集合框架——在文件中存储地图(TryPhoneBook2)

    控制台程序. import java.io.*; public class Person implements Comparable<Person>, Serializable { // ...

  2. windows远程控制ubuntu尝试--未成功

    按照百度知道上的步骤一步一步操作,下载xrdp,一切很顺利. 直至出现了,如下的語言: connecting to sesman ip 尝试找到原因第一个原因 第二次的分析解释 至今还没找出原因

  3. Angular.js+Bootstrap实现表格分页

    最近一直学习Angular.js,在学习过程中也练习了很多的Demo,这里先贴一下表格+分页. 先上图看看最终结果: 不得不说Angular.js代码风格很受人欢迎,几十行代码清晰简洁的实现了上面的功 ...

  4. IDEA 常见文件类型的图标介绍

    官网地址:http://www.jetbrains.com/idea/webhelp/symbols.html        对于各个图标,上图的 Description 写得非常详细,但是有几个还是 ...

  5. devexpress13学习系列(三)PDFViewer(3)

    PdfDocumentProperties Class 该类,用来显示载入的pdf文件的属性,包括:   Name Description Application Indicates the appl ...

  6. UIBarButtonItem变弹簧

    UIBarButtonItem * spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystem ...

  7. 内存溢出之Tomcat内存配置

    设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4. 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置 三.实例,以下给 ...

  8. USACO: Combination Lock

    长久不写算法题,这种简单题折腾了一下午... /* ID: yingzho2 LANG: C++ TASK: combo */ #include <iostream> #include & ...

  9. hdu4918 Query on the subtree

    树分治,设当前树的分治中心为x,其子树分治中心为y,则设father[y]=x,分治下去则可以得到一颗重心树,而且树的深度是logn. 询问操作(x,d),只需要查询重心树上x到重心树根节点上的节点的 ...

  10. Android -- 自定义View小Demo(一)

    1,现在要实现下图的简单效果,很简单  ,就是使用paint在canvas上绘制5中不同颜色的圆圈,效果图如下: 这是绘制基本图形一种最简单的方法,下面是它的代码 ,注释写的很详细,也就不去讲解了 M ...