集训笔记---最短路径算法(最短路 算法一)

https://vjudge.net/contest/246370#problem/D

题目大意是寻找从起点到终点的最短路径,嘿嘿,那么就可以明白了了嘛,这题用贪心!!!!

其实人家有自己的算法名字,但其实其中包含的还是一个贪心算法的思想,找呀找,找到当前点位连接到下一个点位的最短路径嘛,不过对于没有方向的无向图,在找的时候要反过来倒过去的找两遍

#include<cstdio>
#include<algorithm>
using namespace std;
struct edge//使用结构体存储边的信息 
{
    int from;
    int to;
    int time;
};
const int MAX_N = 100010;
edge es[MAX_N];
int n, m;
int dist[MAX_N];//算法书上都有定义,从起点到i点的最短距离 
void sovle();
int main(void)
{
    while(scanf("%d %d", &n, &m))
    {
        if((n==0)&&(m==0))
        {
            break;
        }
        for(int i = 0; i < m; i++)
        {
            scanf("%d %d %d", &es[i].from, &es[i].to, &es[i].time);
        }
        sovle();
        printf("%d\n", dist[n]);
    }
    return 0;

void sovle()
{
    for(int i = 1; i <= n; i++)//初始化数组dist[i] 
    {
        dist[i] = MAX_N;
    }
    dist[1] = 0;//制定起点 
    while(1)
    {
        int flag = 0;
        //遍历每一条边,如果这条边的信息能够使得dist[]数组的值变小
        //就改变它,没有负权边的情况下,总会有那么一刻
        //不存在任何一个边使得dist[]数组得到任何优化,搜索结束 
        for(int i = 0; i < m; i++)
        {
            edge e = es[i];
            //第一个条件找到每一步的当前点位,第二个条件判断是否优化数组 
            if((dist[e.from] != MAX_N) && (dist[e.to] > dist[e.from] + e.time))
            {
                dist[e.to] = dist[e.from] + e.time;
                flag = 1;
            }
            //无向图反过来再来一次 
            else if((dist[e.to] != MAX_N) && (dist[e.from] > dist[e.to] + e.time))
            {
                dist[e.from] = dist[e.to] + e.time;
                flag = 1;
            }
        }
        if(flag == 0)
        {
            break;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/zzuli_xiaomingke/article/details/81629648
今日推荐