HDU 2066 一个人的旅行(单源最短路SPFA)
Description
Input
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。
Output
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
Sample Output
9
须注意重边!!!!!
#include <iostream>
#include <stdio.h>
#include <queue>
#include <algorithm>
#include <string>
#include <string.h>
using namespace std;
#define MAX 1010
#define INF 0x3f3f3f3f struct Edge
{
int v,cost;
Edge(int _v=0,int _cost=0) : v(_v),cost(_cost) {}
}; vector <Edge> E[2*MAX];
bool vis[MAX],loveplace[MAX];; ///是否在队列中标志
int cnt [MAX]; ///每个点的入队次数
int lowcost[MAX];
int mmin;
queue <int>que;
void addedge(int u,int v,int w){
E[u].push_back(Edge(v,w));
}
void ini(int n){
memset(vis,false,sizeof(vis));
memset(cnt,0,sizeof(cnt));
while(!que.empty()) que.pop();
for(int i = 1 ; i<=n ; i++){
lowcost[i] = INF;
}
} ///点编号从1开始
bool SPFA(int n,int start)
{
// cout<<"----------------\n";
ini(n);
vis[start] = true;
lowcost[start] = 0;
cnt[start] = 1; que.push(start); while(!que.empty()){
int u = que.front();
que.pop();
vis[u] = false; for(int i=0 ; i< E[u].size() ; i++){
int v=E[u][i].v ;
if( lowcost[v] > lowcost[u] + E[u][i].cost ){
lowcost[v] = lowcost[u] + E[u][i].cost;
if(mmin>lowcost[v]&&loveplace[v]) mmin = lowcost[v];
if(!vis[v]){ ///未出现在队列中
vis[v] = true;
que.push(v); ///只有到当前点出现更短的路径,并且当前点没有添加到队列中的时候才会添加到队列中再次遍历其孩子
if( ++cnt[v] > n ) return false; ///cnt[i] 为入队列次数 ,用来判断是否存在负环回路(原理???)
}
}
}
}
return true;
} int main (){
int T,S,D,n;
int u,v,w,tmp;
int start[MAX];
bool mark = 0;
while(~scanf("%d%d%d",&T,&S,&D)){
mmin=INF,n=-1;
memset(loveplace,0,sizeof(loveplace));
for(int i=1;i<2*MAX;i++) E[i].clear();
// printf("mmin的初始值为:%d\n",mmin);
for(int i=0;i<T;i++){
mark = 0;
scanf("%d%d%d",&u,&v,&w);
for(int j=0;j<E[u].size();j++){ ///去重边
if(E[u][j].v == v){
if(E[u][j].cost > w){
E[u][j].cost = w , j=E[u].size();
for(int k = 0 ; k <E[v].size() ; k++)
if(E[v][j].v == u)
E[v][j].cost = w , k = E[v].size();
}
mark = 1;
}
}
if(mark == 0){
addedge(u,v,w);
addedge(v,u,w);
if(n<u) n=u;
if(n<v) n=v;
}
}
for(int i=0;i<S;i++)
scanf("%d",&start[i]);
for(int i=0;i<D;i++){
scanf("%d",&tmp);
loveplace[tmp]=1;
}
for(int i=0;i<S;i++)
SPFA(n,start[i]);
printf("%d\n",mmin);
}
return 0;
}
HDU 2066 一个人的旅行(单源最短路SPFA)的更多相关文章
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- 图论-单源最短路-SPFA算法
有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
- [模板][HDU]P2544[单源最短路][SPFA]
题目就不放了,主要是写一下SPFA,很少写,今天特别学了一个用STL的队列来做的. 代码: #include<iostream> #include<cstdio> #inclu ...
- 单源最短路——SPFA算法(Bellman-Ford算法队列优化)
spfa的算法思想(动态逼近法): 设立一个先进先出的队列q用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路 ...
- 单源最短路SPFA算法
$huaji^{233……}$模板:洛谷 P3371 #include<iostream> #include<algorithm> #include<cstdio> ...
- 单源最短路SPFA
#include<iostream> #include<queue> #include<cstring> #define INF 0x3f3f3f3f using ...
- HDU - 2066 一个人的旅行(最短路径)(模板)
d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到这个城市的距离设为0),草儿想去的地方有D个: 求D个城市中距离草儿家最近的距离. s.进行1次单源最短路,找出 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
- 用scheme语言实现SPFA算法(单源最短路)
最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...
随机推荐
- SQL SERVER 生成MYSQL建表脚本
/****** Object: StoredProcedure [dbo].[GET_TableScript_MYSQL] Script Date: 06/15/2012 13:05:14 ***** ...
- Oralce开窗函数OVER()的一些应用
好久没用oracle了,发现很多东西已经忘记.正好今天改写个语句,顺便回忆了一下,乘热整理以备遗忘. over(order by salary) 按照salary排序进行累计,order by是个默认 ...
- Myisam and InnoDB
MyISAM引擎的特点: 1.堆组织表:2.不支持事务:3.数据文件和索引文件分开存储:4.支持全文索引:5.主键索引和二级索引完全一样都是B+树的数据结构,只有是否唯一的区别(主键和唯一索引有唯一属 ...
- DBA常用SQL之数据库基础信息
第一部分: 1. 查看oracle最大连接数 sql>show parameter processes #最大连接数 2. 修改最大连接数 sql>alter system set pro ...
- php日期时间函数
1,年-月-日echo date('Y-m-j');2007-02-6echo date('y-n-j');07-2-6大写Y表示年四位数字,而小写y表示年的两位数字:小写m表示月份的数字(带前导), ...
- [Hibernate] - many to many
Hibernate的多对多实现: hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> ...
- jquery读取csv文件并用json格式输出
直接贴上代码: <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untit ...
- 关于双击事件.MouseEvent.DOUBLE_CLICK
as3提供了双击事件的调用,但有时候碰到双击事件无法响应,所以总结下原因.先摘录一段官方关于 doubleClick 事件发生的条件.如果 InteractiveObject 的 doubleClic ...
- 高性能MySQL --- 读书笔记(1) - 2016/8/2
此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...
- 查询SQLServer 服务器,执行过的SQL语句耗时!
SELECT creation_time N'语句编译时间',last_execution_time N'上次执行时间',total_physical_reads N'物理读取总次数',total_l ...