给定一个有向图,多个起点,一个终点,求起点到终点的最短路。

1.可以加一个点,使其与那些起点的距离为0

2.将图反着来建,然后在所有点找出最小的

方案一:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#define MaxInt 0x3f3f3f3f
using namespace std;
int Map[1005][1005];
int vis[1005];
int low[1005];
int p[1005];
int n,m,s;
int k;
void work()
{
int pos = 0,Min;
memset(vis,0,sizeof(vis));
for(int i = 0; i <= n; i++)
low[i] = Map[pos][i];
vis[pos] = 1;
for(int i = 0; i < n; i++)
{ Min = MaxInt;
for(int j = 0; j <= n; j++)
if(!vis[j] && low[j] < Min)
{
pos = j;
Min = low[j];
}
if(Min == MaxInt)
break;
vis[pos] = 1;
for(int j = 0; j <= n; j++)
if(!vis[j] && low[j] > low[pos]+Map[pos][j])
low[j] = low[pos]+Map[pos][j];
}
if(low[s] < MaxInt)
printf("%d\n",low[s]);
else
printf("-1\n");
} int main()
{
int a,b,c;
while(~scanf("%d%d%d",&n,&m,&s))
{
for(int i = 0; i <= n; i++)
{
Map[i][i] = 0;
for(int j = 0; j <= n; j++)
Map[i][j] = MaxInt;
}
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d",&a,&b,&c);
if(Map[a][b] > c)
Map[a][b]=c;
}
int all,x;
scanf("%d",&all);
for(int i = 1; i <= all; i++){ //加入0点,并使其为起始点
scanf("%d",&x);
Map[0][x] = 0;
}
work();
}
return 0;
}

 

方案二:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MaxInt 0x3f3f3f3f
using namespace std;
int Map[1005][1005];
int vis[1005];
int low[1005];
int p[1005];
int n,m,s;
int k;
void work()
{
int pos = s,Min;
memset(vis,0,sizeof(vis));
for(int i = 0; i <= n; i++)
low[i] = Map[pos][i];
vis[pos] = 1;
for(int i = 0; i < n; i++)
{ Min = MaxInt;
for(int j = 0; j <= n; j++)
if(!vis[j] && low[j] < Min)
{
pos = j;
Min = low[j];
}
if(Min == MaxInt)
break;
vis[pos] = 1;
for(int j = 0; j <= n; j++)
if(!vis[j] && low[j] > low[pos]+Map[pos][j])
low[j] = low[pos]+Map[pos][j];
}
} int main()
{
int a,b,c;
while(~scanf("%d%d%d",&n,&m,&s))
{
for(int i = 0; i <= n; i++)
{
Map[i][i] = 0;
for(int j = 0; j <= n; j++)
Map[i][j] = MaxInt;
}
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d",&a,&b,&c);
if(Map[b][a] > c) //反着建图
Map[b][a]=c;
}
work();
int num,x;
int MinInt = MaxInt;
scanf("%d",&num);
for(int i = 1;i <= num;i++)
{
scanf("%d",&x);
if(low[x] < MinInt) //找出最短的路
MinInt = low[x];
}
if(MinInt < MaxInt)
printf("%d\n",MinInt);
else
printf("-1\n");
}
return 0;
}

Hdu2680 最短路的更多相关文章

  1. HDU2680 Choose the best route 最短路 分类: ACM 2015-03-18 23:30 37人阅读 评论(0) 收藏

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. hdu-2680 Choose the best route(最短路)

    题目链接: Choose the best route Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K ( ...

  3. hdu2680 Choose the best route 最短路(多源转单源)

    此题中起点有1000个,边有20000条.用链式前向星建图,再枚举起点用SPFA的话,超时了.(按理说,两千万的复杂度应该没超吧.不过一般说计算机计算速度 1~10 千万次/秒.也许拿最烂的计算机来卡 ...

  4. bzoj1001--最大流转最短路

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...

  5. 【USACO 3.2】Sweet Butter(最短路)

    题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...

  6. Sicily 1031: Campus (最短路)

    这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...

  7. 最短路(Floyd)

    关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...

  8. bzoj1266最短路+最小割

    本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...

  9. HDU2433 BFS最短路

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. TensorFlow问题“The TensorFlow library wasn't compiled to use SSE instructions, but these are available on your machine and could speed up CPU computations.”

    出现的问题: 在使用TensorFlow跑官方教程例子时报以下warning: 虽程序能正常跑出结果,但作为一名强迫症患者对此很是不爽,于是查找资料找到隐藏该warning的解决办法. 解决办法: 在 ...

  2. System V IPC 之消息队列

    消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型 ...

  3. Win10安装Ubuntu14.04.5双系统(显示器为DP接口)

    系统安装主要参考了这篇博文Win10+Ubuntu17.04双系统安装,不再重复. 重点说说DP接口的事,如果主机有VGA接口的话可以到此为止了,如果只有DP接口的话可以参考以下内容. 一.Ubunt ...

  4. GIT入门笔记(18)- 标签创建和管理

    git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id: git tag -a <tagname> -m "blablabla ...

  5. 百度资深架构师带你深入浅出一致性Hash原理

    一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用. 但是普通的余数h ...

  6. MYSQL 面试查询系列问题

    表结构: `student`('id'.'name'.'code'.'age'.'sex')学生表 `teacher`('id'.'name')教师表 `course`('id'.'name'.'te ...

  7. anguar使用指令写选项卡

    今天,我们来学习一下angular中怎么使用指令来实现两个选项卡的问题. 首先,要先引入jQuery文件与angularjs文件. <!DOCTYPE html><html lang ...

  8. SQLContext、HiveContext自定义函数注册

    本文简单介绍两种往SQLContext.HiveContext中注册自定义函数方法. 下边以sqlContext为例,在spark-shell下操作示例: scala> sc res5: org ...

  9. SqlServer优化:当数据量查询不是特别多,但数据库服务器的CPU资源一直100%时,如何优化?

    最近和同事处理一个小程序,数据量不是特别大,某表的的数据记录:7000W条记录左右,但是从改别执行一次查询时,却发现查询速度也不快,而且最明显的问题就是CPU100%. sql语句: select g ...

  10. 框架学习之Struts2(三)---OGNL和值栈

    一.OGNL概述 1.1OGNL是对象图导航语言(Object-Graph Navigation Languaged)的缩写,他是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对 ...