hdu 2544 最短路(SPFA算法)
2024-08-26 20:36:37
本题链接:点击打开链接
本题大意:
首先输入一个n,m。代表有n个点。m条边。然后输入m条边,每条边输入两个点及边权。1为起点,n为终点。输入两个零表示结束。
解题思路:
本题能够使用SPFA算法来做。此算法与dijkstra算法的差别在于,此算法能够计算边权为负值的情况。使用此算法首先须要用邻接表建图,用dis数组存放当前点距起点的最短权值之和。用mark数组标记已使用过的点。SPFA算法过程与广度优先搜索相似,此代码与BFS的差别在于已经标记的点。在再次取出来的时候要取消标记。
本题AC代码例如以下:
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAXN 110
#define MAXM 20200
#define INF 0x3f3f3f3f
using namespace std;
int head[MAXN];
int mark[MAXN];
int dis[MAXN];
int num;
struct node{
int from;
int to;
int val;
int next;
};
node edge[MAXM];
void getmap(int u,int v,int w)
{
node e={u,v,w,head[u]};
edge[num]=e;
head[u]=num++;
}
void SPFA(int s)
{
memset(mark,0,sizeof(mark));
memset(dis,INF,sizeof(dis));
queue<int>q;
q.push(s);
dis[s]=0;
mark[s]=1;
while(!q.empty())
{
int top=q.front();
q.pop();
mark[top]=0;
for(int i=head[top];i!=-1;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]>dis[top]+edge[i].val)
{
dis[u]=dis[top]+edge[i].val;
if(!mark[u])
{
mark[u]=1;
q.push(u);
} }
}
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n||m)
{
memset(head,-1,sizeof(head));
num=0;
for(int i=0;i<m;i++)
{
int a,b,d;
scanf("%d%d%d",&a,&b,&d);
getmap(a,b,d);
getmap(b,a,d);
}
SPFA(1);
printf("%d\n",dis[n]);
}
return 0;
}
最新文章
- html+css做的丝带标签
- Mybatis关联查询(嵌套查询)
- java.util.concurrent.atomic 包详解
- function 类型
- TranslateAnimation 使用详解
- SQL学习笔记 SQL ORDER BY 关键字
- JavaScript代码优化(下载时间和执行速度优化)
- eclipse-android-activity_main/fragment_main文件处理
- webBrower控件实现winform和webpage交互
- Varnish缓存服务详解及应用实现
- 老李谈HTTP1.1的长连接
- AI 这么优秀,连我鉴黄师的饭碗都抢了
- MySQL 常用指令小结
- uboot 设备树 libfdt
- MyBatis(一)helloWorld程序
- TM1629A驱动程序
- 关于Unity中的刚体和碰撞器的相关用法(一)
- js 知识点整理
- JS 开发者必须知道的十个 ES6 新特性
- SharePoint客户端对象模型—任务日历生成
热门文章
- chosen-bootstrap使用技巧
- ubuntu下pycharm无法使用pip安装python包的修复方案
- vue 模板下只能有一个跟节点 根节点一定要是个div
- CSS hover 改变另外一个元素状态
- 09CSS高级定位
- 第1节 yarn:13、yarn资源调度的介绍
- hdfs深入:08、hdfs的JavaAPI以及如何解决winutils的问题
- git Please tell me who you are解决方法
- 诊断:MRP0: Background Media Recovery terminated with error 1111
- BZOJ 4823 Luogu P3756 老C的方块 染色+最小割