Shopping(SPFA+DFS HDU3768)
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)的更多相关文章
- 【PAT甲级】1003 Emergency (25 分)(SPFA,DFS)
题意:n个点,m条双向边,每条边给出通过用时,每个点给出点上的人数,给出起点终点,求不同的最短路的数量以及最短路上最多能通过多少人.(N<=500) AAAAAccepted code: #in ...
- 【PAT甲级】1030 Travel Plan (30 分)(SPFA,DFS)
题意: 输入N,M,S,D(N,M<=500,0<S,D<N),接下来M行输入一条边的起点,终点,通过时间和通过花费.求花费最小的最短路,输入这条路径包含起点终点,通过时间和通过花费 ...
- 【PAT甲级】1018 Public Bike Management (30 分)(SPFA,DFS)
题意: 输入四个正整数C,N,S,M(c<=100,n<=500),分别表示每个自行车站的最大容量,车站个数,此次行动的终点站以及接下来的M行输入即通路.接下来输入一行N个正整数表示每个自 ...
- POJ3621Sightseeing Cows[01分数规划 spfa(dfs)负环 ]
Sightseeing Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9703 Accepted: 3299 ...
- PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)
L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...
- PAT (Advanced Level) Practise 1003 Emergency(SPFA+DFS)
1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...
- POJ 3411 Paid Roads(SPFA || DFS)
题目链接 题意 : 要从1城市到n城市,求最短路是多少,从a城市到达b城市的路程,如果你到过c城市,则需要走p,否则走r长. 思路 : 因为可以来回走,所以不能用单纯的最短路,可以用二维SPFA,状态 ...
- hdu1428之spfa+dfs
漫步校园 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- Key Vertex (hdu 3313 SPFA+DFS 求起点到终点路径上的割点)
Key Vertex Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota ...
随机推荐
- java io读书笔记(7) Closing Output Streams
输出完毕后,需要close这个stream,从而使操作系统释放相关的资源.举例: public void close( ) throws IOException 并不是所有的stream都需要clos ...
- Leetcode: Insert Delete GetRandom O(1) - Duplicates allowed
Design a data structure that supports all following operations in average O(1) time. Note: Duplicate ...
- JAVA多线程与多进程
并发与并行是两个既相似而又不相同的概念,但往往容易混为一谈,这两者究竟有什么区别呢?本文通过一个例子让你更好地理解(本文由并发编程网翻译). 现代社会是并行的:多核.网络.云计算.用户负载,并发技术对 ...
- 纪念我sgu第一个10题!
哎,等下次再做20题纪念一下!尼玛,根本做不出来,还要到处翻别人的555555555555
- 现在觉得IT还挺有意思
前两天刚刚接触编程,用的是C#.开始确实枯燥,但是今天的感觉就好多了,还挺有意思.根据老师讲的课程自己编写了小程序,运行起来还不错.在这里分享下. 关于时间安排的小程序: int sj; int aa ...
- IUS通过PLI产生fsdb波形
IUS通过PLI接口来调用系统函数,产生fsdb波形,再由verdi来debug. 要调用fsdbDumpfile和fsdbDumpvars,需要在testcase的shell(或.cshrc等)中设 ...
- [Ubuntu] ubuntu13.04 从php5.4降级到php5.3
ubuntu12.10以后,默认的deb安装库上面的php版本已经是5.4了,公司的项目使用5.4的时候,还是会出现很多问题,所以不得不降级安装5.3 顺便说一句,我原来的环境是nginx + php ...
- centos中的qt设计师所在的包
由于暂时用不到qt的ide,所以想把它卸了,经过一番查找,其所在的包名是: qt-devel
- SQL SERVER2012秘钥
来自网络: MICROSOFT SQL SERVER 2012 DEVELOPER 版(开发版)序列号:YQWTX-G8T4R-QW4XX-BVH62-GP68YMICROSOFT SQL SERVE ...
- React笔记_(5)_react语法4
ajax 数据应用场景 在真实的开发环境中,拿到了产品需求,第一件事不是逼着后台开发人员先完成,然后前端再介入开发,这样太浪费时间. 正确的做法是跟后端人员先商量好接口名称,请求参数,返回的数据格式等 ...