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. 转:python webdriver API 之下载文件

    webdriver 允许我们设置默认的文件下载路径.也就是说文件会自动下载并且存在设置的那个目录中.要想下载文件,首选要先确定你所要下载的文件的类型.要识别自动文件的下载类型可以使用 curl ,如图 ...

  2. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Capture the Flag

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5503 The 12th Zhejiang Provincial ...

  3. C++之路起航——标准模板库(list)

    list(链表):http://baike.baidu.com/link?url=gkVdBlHEzy6ssrgT5Iy2wze4jl37ka1G45TRpUHrQSYFZQg2HimtUCePV0t ...

  4. HDFS简介

    Hadoop是当今最为流行的大数据分析和处理工具. 其最先的思想来源于Google的三篇论文:                            GFS(Google File System):是 ...

  5. bzoj4137 [FJOI2015]火星商店问题

    比较容易想到的做法是线段树套字典树,修改操作时在字典树上经过的节点维护一个最近被访问过的时间,这样询问操作只经过满足时间条件的节点,时间复杂度O(NlogN^2)但是因为线段树每个节点都要套个字典树, ...

  6. demo05

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  7. phpredis 订阅者模式

    [TOC] 一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用 ...

  8. 夺命雷公狗---Thinkphp----1之目录介绍

    ThinkPHP框架 特点: 免费开源 敏捷开发(快速开发) 面向对象 MVC思想 yii,ci之类的框架都有这些特点.是06年到现在的一个老牌框架,现在还是个很不错的框架 可以在thinkphp的官 ...

  9. 夺命雷公狗---TP商城----TP之配置环境---1

    下载到tp3.2.3版本后架设到自己的wamp环境下,然后配置虚拟主机,完事后直接开工 环境下创建一个文件夹,然后里面存放这这两个文件即可开始新的旅途了 这里完了,下一步就开始配置index.php文 ...

  10. 弹出层和ajax数据交互

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...