zoukankan      html  css  js  c++  java
  • 最短路 SPFA模板

    #include "cstdio"  //邻接表+spfa算法(不断松弛操作) hdu 2544
    #include "queue"
    #include "string.h"
    using namespace std;
    
    struct node 
    {
    	int x;
    	int value;   //价值
    	int next;  //存下一条边的下标
    }edge[60000];
    
    int n,m,idx;
    bool mark[1505];
    int dis[1505],adj[1505];
    
    void init()
    {
    	int i;
    	idx = 1;
    	memset(mark,false,sizeof(mark));  //标记每个点是否加入了队列
    	for(i=2;i<1505;i++)                //存最短距离
    		dis[i] = 0x3fffffff;
    	dis[1] = 0;
    	memset(adj,-1,sizeof(adj));  //建邻接表用,存最开始的边的下标
    }
    
    void addedge(int u,int v,int w)
    {
    	edge[idx].x = v;
    	edge[idx].value = w;
    	edge[idx].next = adj[u];
    	adj[u] = idx;
    	idx++;
    }
    
    int main()
    {
    	int i,j;
    	int u,v,w;
    	while(scanf("%d%d",&n,&m),n||m)  //n表示点的个数,m表示边的条数
    	{
    		init();   //初始化函数
    		for(i=1;i<=m;i++)
    		{
    			scanf("%d %d %d",&u,&v,&w);
    			addedge(u,v,w);
    			addedge(v,u,w);
    		}
    		int cur = 1;
    		queue<int> q;
    		q.push(cur);
    		mark[cur] = true;
    		dis[cur] = 0;
    		while(!q.empty())
    		{
    			cur = q.front();
    			q.pop();
    			mark[cur] = false;  //点已出对列,标记还原;
    			int k = adj[cur];
    			while(k!=-1)  //对cur连接的边进行遍历
    			{
    				if(dis[edge[k].x] > dis[cur]+edge[k].value)
    				{
    					dis[edge[k].x]=dis[cur]+edge[k].value;
    					if(mark[edge[k].x]==false)  //若该点还没有加入队列中,则加入队列
    					{
    						mark[edge[k].x] = true;
    						q.push(edge[k].x);
    					}
    				}
    				k = edge[k].next;  //访问下一个点
    			}
    		}
    		printf("%d
    ",dis[n]);
    	}
    	return 0;
    }
    			
    

  • 相关阅读:
    gluon模块进行数据加载-Dataset和DataLoader
    梯度相关概念
    plt.rcParams参数设置
    矩阵求导(二)
    矩阵求导(一)
    使用MXNet的NDArray来处理数据
    Win10环境下Anaconda安装常用指令以及环境管理
    Git使用vi或vim命令打开、关闭、保存文件
    工作中遇到的问题总结
    学习 Python3 语言
  • 原文地址:https://www.cnblogs.com/ruo-yu/p/4412008.html
Copyright © 2011-2022 走看看