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

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents

    ------------------------------------------------------------------------------------------------------------------------------------------------------
    欢迎光临天资小屋害羞害羞害羞害羞http://user.qzone.qq.com/593830943/main
    
    
    ------------------------------------------------------------------------------------------------------------------------------------------------------


    模板奉上:(HDU2544)

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #define MAXN 117
    #define INF 0x3fffffff
    using namespace std;
    int mat[MAXN][MAXN];
    int n,m;//n为结点数,m为道路数
    int dijkstra (int s,int f)
    {
    	//s为起点, f:为终点
    	int dis[MAXN];//记录到随意点的最短距离
    	int mark[MAXN];//记录被选中的结点 
    	int i, j, k;
        for(i = 1; i <= n; i++)
        {
    		mark[i] = 0;//初始化全部结点。每一个结点都没有被选中 
            dis[i] = INF;
    		//dis[i] = mat[s][i];
        }
        mark[s] = 1;//start结点被选中 
        dis[s] = 0;//将start结点的的距离设置为0 
        int min;//设置最短的距离。 
        for(i = 1; i <= n; i++)
        {
    		k = 1;//赋初值非常重要
            min = INF;
            for(j = 1; j <= n;j++)
            {
                if(!mark[j] && dis[j] < min)//未被选中的结点中,距离最短的被选中 
                {
                    min = dis[j] ;
                    k = j;
                }
            }
            mark[k] = 1;//标记为被选中 
            for(j = 1; j <= n; j++)
            {
                if(!mark[j] && dis[j]>dis[k] + mat[k][j])//改动剩余结点的最短距离 
                {
                    dis[j] = dis[k] + mat[k][j];
                }
            }
        }
        return dis[f];    
    } 
    
    void init()
    {
    	for(int i = 0; i <= n; i++)
    	{
    		for(int j = 0; j <= n; j++)
    		{
    			if(i == j)
    				mat[i][j] = 0;
    			else
    				mat[i][j] = INF;
    		}
    	}
    }
    int main()
    {
    	int i,j;
    	int a,b,dis;
    	while(scanf("%d %d",&n,&m))
    	{
    		if(n == 0 || m == 0)
    			break;
    		init();
    		for(i = 1; i <= m; i++)
    		{
    			scanf("%d %d %d",&a,&b,&dis);
    			if(dis < mat[a][b] || dis < mat[b][a])
    				mat[a][b] = mat[b][a] = dis;
    		}
    		int ans = dijkstra(1,n);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }


  • 相关阅读:
    python登录qq
    js加解密的算法
    python request模板
    qq查询接口
    python代理池的实现
    mvvm实现
    消息队列
    【Linux常见命令】seq命令
    【Linux常见命令】find命令
    【Linux常见命令】rm命令
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5225046.html
Copyright © 2011-2022 走看看