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语言实现单源最段路算法.当时的我,花了一整天时间,学 ...
随机推荐
- Java语言编码规范(Java Code Conventions)
Java语言编码规范(Java Code Conventions) 名称 Java语言编码规范(Java Code Conventions) 译者 晨光(Morning) 简介 本文档讲述了Java语 ...
- win7下MariaDB10.0的my.ini配置文件的位置
msi版本的,安装后在安装目录下的\data\my.ini 常用的配置选项: 1.修改默认的存储引擎 在配置文件my.ini(linxu下为my.cnf) 中的 [mysqld] 下面加入defaul ...
- 基本的 HTML 标签 - 四个实例
本章通过实例向您演示最常用的 HTML 标签. 提示:不要担心本章中您还没有学过的例子,您将在下面的章节中学到它们. 提示:学习 HTML 最好的方式就是边学边做实验.我们为您准备了很好的 HTML ...
- IOS开发-UI基础-视图
//------------------------------UIWindow--------------------------// 1.UIWindow:是 UIView 的子类,用于管理.协调 ...
- postgresql数据库文件目录
不同的发行版位置不同 查看进程 ps auxw | grep postgres | grep -- -D 找到默认的目录 /usr/lib/postgresql/9.4/bin/postgres -D ...
- Spring MVC 教程,快速入门,深入分析
http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: ...
- Linux xargs命令
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从 ...
- java和C++在多态实现上的区别
1:java中没有虚函数的概念,但是有抽 象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象 函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某 ...
- C#中abstract和virtual区别
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- 黄聪:TinyMCE 4 增强 添加样式、按钮、字体、下拉菜单和弹出式窗口
我最喜欢 WordPress 3.9 的更新是使用了 TinyMCE 4.0 编辑器.新的 TinyMCE 看起来看起来更整洁(真正匹配WP仪表板),它有一些非常不错的附加功能.我的很多老主题和插件必 ...