hdoj 1874 畅通工程续【dijkstra算法or spfa算法】
畅通工程续
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 33724 Accepted Submission(s):
12329
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
#include<stdio.h>
#include<string.h>
#define INF 0x3f3f3f
int lowdis[210],map[210][210],visit[210];
int city;
int begin,end;
void dijkstra() //此算法与prime最小生成树算法比较相似
{
int j,i,mindis,next;
memset(visit,0,sizeof(visit));
for(i=0;i<city;i++)
{
lowdis[i]=map[begin][i]; //因为题目中要求的有起始点和终点,所以此处应先初始化lowdis数组
} //为从起始点到其余所有点的距离
visit[begin]=1; //首先将起始点放入最短路径数组
for(i=0;i<city-1;i++)
{
mindis=INF;
for(j=0;j<city;j++)
{
if(!visit[j]&&mindis>lowdis[j])
{
mindis=lowdis[j];
next=j;
}
}
/*if(mindis==IFN)
{
printf("-1\n"); //(1)
} */
visit[next]=1;
for(j=0;j<city;j++)
{
if(!visit[j]&&lowdis[j]>map[next][j]+lowdis[next])
lowdis[j]=map[next][j]+lowdis[next];
}
}
if(lowdis[end]==INF) //如果到终点的最短路径为无穷大则无通路(注意,此处的有无通路判断与最小生成树中的判断有一定区别
printf("-1\n"); //如题解所说,最短路径问题中两个节点之间可能存在多条通路,所以(1)处即使mindis等于无穷也可能有其他通路)
else
printf("%d\n",lowdis[end]);
}
int main()
{
int i,j,road,x,y,c;
while(scanf("%d%d",&city,&road)!=EOF)
{
for(i=0;i<city-1;i++)
{
for(j=i+1;j<city;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=map[j][i]=INF;
}
}
while(road--)
{
scanf("%d%d%d",&x,&y,&c);
if(map[x][y]>c)
{
map[x][y]=map[y][x]=c;
}
}
scanf("%d%d",&begin,&end);
dijkstra();
}
return 0;
}
spfa:
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 20000
#define INF 0x3f3f3f
using namespace std;
int n,m,ans;
int beg,en;
int dis[MAX],vis[MAX];
int head[MAX];
struct node
{
int u,v,w;
int next;
}edge[MAX];
void init()
{
ans=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v,int w)
{
edge[ans].u=u;
edge[ans].v=v;
edge[ans].w=w;
edge[ans].next=head[u];
head[u]=ans++;
}
void getmap()
{
int a,b,c;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
scanf("%d%d",&beg,&en);
}
void spfa(int sx)
{
int i,j;
queue<int>q;
for(i=0;i<=n;i++)
dis[i]=INF;
memset(vis,0,sizeof(vis));
dis[sx]=0;
vis[sx]=1;
q.push(sx);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(i=head[u];i!=-1;i=edge[i].next)
{
int top=edge[i].v;
if(dis[top]>dis[u]+edge[i].w)
{
dis[top]=dis[u]+edge[i].w;
if(!vis[top])
{
vis[top]=1;
q.push(top);
}
}
}
}
if(dis[en]==INF)
printf("-1\n");
else
printf("%d\n",dis[en]);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
getmap();
spfa(beg);
}
return 0;
}
hdoj 1874 畅通工程续【dijkstra算法or spfa算法】的更多相关文章
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- HDU 1874畅通工程续(迪杰斯特拉算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) ...
- hdu 1874 畅通工程续 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...
- HDU 1874 畅通工程续(最短路/spfa Dijkstra 邻接矩阵+邻接表)
题目链接: 传送门 畅通工程续 Time Limit: 1000MS Memory Limit: 65536K Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路. ...
- hdu 1874 畅通工程续 (dijkstra(不能用于负环))
畅通工程续Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdoj 1874 畅通工程续(单源最短路+dijkstra)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 思路分析:该问题给定一个无向图.起始点和终点,要求求出从起始点到终点的最短距离: 使用Dijks ...
- hdoj 1874 畅通工程续
Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行 ...
- HDU 1874 畅通工程续(模板题——Floyd算法)
题目: 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰 ...
随机推荐
- 安装Ubuntu双系统系列——更换源
Ubuntu 有一个非常有用的命令 apt-get,它可以帮助你下载软件,还可以安装,下载并安装的命令是 apt-get install. 那Ubuntu默认是从哪里下载软件呢,这可以查看文件/etc ...
- mysql concat和group_concat
mysql concat(str1,str2...)连接两个字符串,(数字也是可以的,会转成字符串) MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL mys ...
- 存储过程 务的概念 事务的特性 关于异常的处理 连接池 构JdbcUtil类
1 存储过程 1)用当地数据库语言,写的一段业务逻辑算法,并该算法存储在客户端 2)使用存储过程需要用于CallableStatement接口,同时需要使如下SQL命令调用:{call a ...
- Git教程(8)Git几种工作方式
1,集中共享式(1个仓库) 其中角色: 1个远程仓库,N个开发者. 工作方式: 集中式系统:所有开发者共享同一个远程仓库.每次推送数据到远程仓库时都要先更新一下. 利用 Git 的分支模型,通过同时在 ...
- 摄像头(3)调用系统拍照activity来拍照
import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager ...
- Redpine的Lite-Fi解决方案获Wi-Fi CERTIFIED认证
应用微电路公司(AMCC)和Redpine Signals日前共同宣布,已合作开发出新一代基于Power Architecture的嵌入式Wi-Fi连接性解决方案,目前双方已经在AMCC的PowerP ...
- 【HDOJ】3007 Buried memory
1. 题目描述有n个点,求能覆盖这n个点的半径最小的圆的圆心及半径. 2. 基本思路算法模板http://soft.cs.tsinghua.edu.cn/blog/?q=node/1066定义Di表示 ...
- linux根目录下的文件夹
http://wenku.baidu.com/link?url=PDpw0nuLm71kihyYWdGY2niJhQEsJXfu8NVbjy9RxLa-Zur3aoG4NkCFpD-GQKM_sQWN ...
- case语句居然还可以这么用的
直接上代码了 // switch case case语句测试.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<ios ...
- CSS那些事儿-阅读随笔1(CSS简介与选择符)
最近开始详细钻研CSS有关的知识,参考资料是<CSS那些事儿>.将把在此过程中的收获进行记录,方便以后的学习. 一.CSS简介 1.什么是CSS CSS全称为Cascading Style ...