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语言实现单源最段路算法.当时的我,花了一整天时间,学 ...
随机推荐
- android dimens 读取 px&dp问题
1.dimens.xml文件: <resources> <dimen name="area_margin_top">100dp</dimen& ...
- eclipse打包jar文件(含外部jar包)的方法
在项目发布前,使用eclipse导出普通的jar包时,如果配置不好,在运行命令Java -jar /test.jar 时可能会出现如下三类错误信息: 1.no main manifest attrib ...
- [Hibernate] - one to many
事实上one to many 和 many to one是一样的,这是一个相互的过程. hibernate.cfg.xml <?xml version="1.0" encod ...
- PEM文件格式详细解析
PEM文件格式存档 Author:Roson sun sunxiao@tomonline-inc.com Time:2006-4-11 1. 描述: Openssl使用PEM(RFC 1421-14 ...
- Samba配置文件常用参数详解-OK
Samba的主配置文件叫smb.conf,默认在/etc/samba/目录下. smb.conf含有多个段,每个段由段名开始,直到下个段名.每个段名放在方括号中间.每段的参数的格式是:名称=指.配置文 ...
- 移动Oracle的用户表空间文件方法
原文:http://www.linuxidc.com/Linux/2014-07/104702.htm 1.以sys用户登录 sqlplus /nologSQL>connect s ...
- 黄聪:Mysql5.6缓存命中率
MySQL缓存命中率,网上说法不一,下面我说下我的看法,大家轻拍: 总的select查询数等于com_select(没命中) + qcache_hits(命中) + 解析错误的查询. 再来看看Com_ ...
- 解密:wp-includes/load.php
描述:定义加载 WP 所需要的函数.1)wp_unregister_GLOBALS(),关闭’GLOBALS’, ‘_GET’, ‘_POST’, ‘_COOKIE’, ‘_REQUEST’, ‘_S ...
- HashMap 实现详解
HashMap是哈希表对Map非线程安全版本的实现,它允许key为null,也允许value为null.所谓哈希表就是通过一个哈希函数计算出一个key的哈希值,然后使用该哈希值定位对应的value所在 ...
- HtmlParser + HttpClient 实现爬虫
简易爬虫的实现 HttpClient 提供了便利的 HTTP 协议访问,使得我们可以很容易的得到某个网页的源码并保存在本地:HtmlParser 提供了如此简便灵巧的类库,可以从网页中便捷的提取出指向 ...