HDU 2544 最短路 (多种解法)

2024-08-28 07:48
文章标签 多种 短路 hdu 解法 2544

本文主要是介绍HDU 2544 最短路 (多种解法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 35912    Accepted Submission(s): 15609


Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?


Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

Sample Input
    
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0

Sample Output
    
3 2

Source
UESTC 6th Programming Contest Online

Recommend
lcy   |   We have carefully selected several similar problems for you:   1217  1142  1385  2680  1596 
Dijkstra算法和prime算法的代码差不多,就多了lowcost[k];
http://acm.hdu.edu.cn/showproblem.php?pid=2544
这道题是Dijkstra的入门题目

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>

#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657

const ull inf = 1LL << 61;
const double eps=1e-5;
const int INF=1<<30;
using namespace std;

bool cmp(int a,int b){
return a>b;
}
int edge[110][110];
int lowcost[110];
int vis[110];
int n,m;
void Dj(int cur)
{
cle(vis);
vis[cur]=1;
for(int i=1;i<=n;i++)
lowcost[i]=edge[cur][i];
int k,Min;
while(1)
{
Min=INF;
for(int j=1;j<=n;j++)
if(!vis[j]&&Min>lowcost[j])
{
Min=lowcost[j];k=j;
}
if(Min==INF)break;
vis[k]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&lowcost[j]>lowcost[k]+edge[k][j])
lowcost[j]=lowcost[k]+edge[k][j];
}
}
cout<<lowcost[n]<<endl;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);

int a,b,c;
while(cin>>n>>m)
{
if(n==0&&m==0)break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{ if(i==j){edge[i][j]=0;edge[j][i]=0;}
else {edge[i][j]=INF;edge[j][i]=INF;}
}
for(int i=1;i<=m;i++)
{
cin>>a>>b>>c;
if(c<INF)
{ edge[a][b]=c;
edge[b][a]=c;
}
}
// cout<<INF<<endl;
Dj(1);
}
return 0;
}


下面是弗洛伊德算法解题

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>

#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657

const
ull inf = 1LL << 61;
const
double eps=1e-5;
const
int INF=99999999;
using namespace
std;

bool
cmp(int a,int b){
return
a>b;
}

int
d[110][110];
int
main()
{

//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int i,j,k,m,n;
int
a,b,c;
while
(cin>>n>>m)
{

if
(n==0&&m==0)break;
for
(i=1;i<=n;i++)
{

for
(j=1;j<=n;j++)
{
d[i][j]=INF;d[j][i]=INF;}

d[i][i]=0;///注意初始化细节
}
for
(i=1;i<=m;i++)
{

scanf("%d%d%d",&a,&b,&c);
if
(d[a][b]>c)
{

d[a][b]=c;d[b][a]=c;
}
}

for
(k=1;k<=n;k++)
for
(i=1;i<=n;i++)
for
(j=1;j<=n;j++)
{

if
(d[i][k]+d[k][j]<d[i][j])
d[i][j]=d[i][k]+d[k][j];
}

cout<<d[1][n]<<endl;
}


return
0;
}
最短路 --Dijkstra算法 - 风未定 - Guanjun的博客~~
 
Bellman-Ford算法解法

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>

#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657

const ull inf = 1LL << 61;
const double eps=1e-5;
const int INF=99999999;
using namespace std;
bool cmp(int a,int b){
return a>b;
}
struct Edge
{
int u,v;
int weight;
}edge[2*maxn]; ///保存边的值
int dist[110]; ///节点到源点的最小距离
int nodenum,edgenum,source=1;
int a,b,c;
void init()
{
for(int i=1;i<=nodenum;i++)
dist[i]=INF;
dist[source]=0;
for(int i=1;i<=2*edgenum;i++)
{
cin>>a>>b>>c;///无向图
edge[i].u=a;edge[i].v=b;edge[i].weight=c;
///if(edge[i].u==source)如果起点和为原点
///dist[edge[i].v]=edge[i].weight;
i++;
edge[i].u=b;edge[i].v=a;edge[i].weight=c;
}
}
///松弛操作
void relax(int u,int v,int weight)
{
if(dist[v]>dist[u]+weight)
{
dist[v]=dist[u]+weight;
}
}
bool Bellman_Ford()
{
for(int i=1;i<nodenum;i++)///枚举边,1条边到终点2条边到终点.....
for(int j=1;j<=2*edgenum;j++)
relax(edge[j].u,edge[j].v,edge[j].weight);
bool flag=1;
///判断是否有负环路
///无向图!!
for(int i=1;i<=edgenum;i++)
if(dist[edge[i].v]>dist[edge[i].u]+edge[i].weight)///还可以更新的话
{
flag=0;
break;
}
return flag;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(cin>>nodenum>>edgenum)
{
if(nodenum==0&&edgenum==0)break;
init();
if(Bellman_Ford())
cout<<dist[nodenum]<<endl;
}
return 0;
}


这篇关于HDU 2544 最短路 (多种解法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114163

相关文章

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Java 中实现异步的多种方式

《Java中实现异步的多种方式》文章介绍了Java中实现异步处理的几种常见方式,每种方式都有其特点和适用场景,通过选择合适的异步处理方式,可以提高程序的性能和可维护性,感兴趣的朋友一起看看吧... 目录1. 线程池(ExecutorService)2. CompletableFuture3. ForkJoi

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

python展开嵌套列表的多种方法

《python展开嵌套列表的多种方法》本文主要介绍了python展开嵌套列表的多种方法,包括for循环、列表推导式和sum函数三种方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、嵌套列表格式二、嵌套列表展开方法(一)for循环(1)for循环+append()(2)for循环+pyPhWiFd

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

电脑开机提示krpt.dll丢失怎么解决? krpt.dll文件缺失的多种解决办法

《电脑开机提示krpt.dll丢失怎么解决?krpt.dll文件缺失的多种解决办法》krpt.dll是Windows操作系统中的一个动态链接库文件,它对于系统的正常运行起着重要的作用,本文将详细介绍... 在使用 Windows 操作系统的过程中,用户有时会遇到各种错误提示,其中“找不到 krpt.dll”

python多种数据类型输出为Excel文件

《python多种数据类型输出为Excel文件》本文主要介绍了将Python中的列表、元组、字典和集合等数据类型输出到Excel文件中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一.列表List二.字典dict三.集合set四.元组tuplepython中的列表、元组、字典

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入