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

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. 每日冲刺报告——Day1(Java-Team)

    第一天报告(11.2  周四) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...

  2. 2017北京国庆刷题Day1 afternoon

    期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目 ...

  3. Java中RuntimeException和Exception的区别

    [TOC] 1. 引入RuntimeException public class RuntimeException { public static void main(String[] args) { ...

  4. 织梦cms网上复制图片不可用的解决方法

    背景描述: 织梦cms采集图片集时, 需要使用织梦cms提供的"网上复制图片"的功能, 好像我这里这个功能一直不可用, 今天下定决心研究了下源代码并进行了适当修改, 将我的修改提供 ...

  5. JAVA_SE基础——71.Random类制作随机验证码

    public class Demo5 { public static void main(String[] args) { char[] arr={'s','b','g','h','a','c'}; ...

  6. Python内置函数(12)——str

    英文文档: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string  ...

  7. linux下xargs和管道的区别

    管道将前面的标准输出作为后面的标准输入,xargs则将标准输入作为命令的参数 一.简介 1.背景 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了x ...

  8. 新概念英语(1-37)Making a bookcase

    What is Susan's favourite color ? A:You're working hard, Georage. What are you doing? B:I am making ...

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

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

  10. Python入门之函数的形式参数与实参/参数的具体使用方法

    本篇目录: 一. 函数参数之形式参数与实参 二. 函数参数的具体使用 #1.位置参数:按照从左到右的顺序定义的参数 位置形参:必选参数 位置实参:按照位置给形参传值 #2.关键字参数:按照key=va ...