本题链接:点击打开链接

本题大意:

首先输入一个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;
}

最新文章

  1. html+css做的丝带标签
  2. Mybatis关联查询(嵌套查询)
  3. java.util.concurrent.atomic 包详解
  4. function 类型
  5. TranslateAnimation 使用详解
  6. SQL学习笔记 SQL ORDER BY 关键字
  7. JavaScript代码优化(下载时间和执行速度优化)
  8. eclipse-android-activity_main/fragment_main文件处理
  9. webBrower控件实现winform和webpage交互
  10. Varnish缓存服务详解及应用实现
  11. 老李谈HTTP1.1的长连接
  12. AI 这么优秀,连我鉴黄师的饭碗都抢了
  13. MySQL 常用指令小结
  14. uboot 设备树 libfdt
  15. MyBatis(一)helloWorld程序
  16. TM1629A驱动程序
  17. 关于Unity中的刚体和碰撞器的相关用法(一)
  18. js 知识点整理
  19. JS 开发者必须知道的十个 ES6 新特性
  20. SharePoint客户端对象模型—任务日历生成

热门文章

  1. chosen-bootstrap使用技巧
  2. ubuntu下pycharm无法使用pip安装python包的修复方案
  3. vue 模板下只能有一个跟节点 根节点一定要是个div
  4. CSS hover 改变另外一个元素状态
  5. 09CSS高级定位
  6. 第1节 yarn:13、yarn资源调度的介绍
  7. hdfs深入:08、hdfs的JavaAPI以及如何解决winutils的问题
  8. git Please tell me who you are解决方法
  9. 诊断:MRP0: Background Media Recovery terminated with error 1111
  10. BZOJ 4823 Luogu P3756 老C的方块 染色+最小割