Sakura晞月

导航

Dijkstra算法

题目:畅通工程

参考了其他的博客 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n, m, s, t;
int e[120][120], dis[120]; //e用来存储各村庄(点)相通边长的情况,d用来存储权值 (即边的长度) 
bool vis[120];

//Dijkstra算法 
void Dijkstra(int src)
{
    //初始化 
    for(int i = 1; i <= n; i++)
    {
        dis[i] = e[src][i]; //把目标点与其他点的距离存到距离数组中去 
        vis[i] = 0; //均为连通 
    }
    
    dis[src] = 0;
    vis[src] = 1;
    
    int k, tmp;//均为标记变量 
    for(int i = 0; i < n; i++)
    {
        tmp = 19920603;
        for(int j = 0; j < n; j++)
            if(!vis[j] && tmp > dis[j])
            {
                k = j;
                tmp = dis[j];
            }
        if(tmp == 19920603) break;
        vis[k] = 1;//标记为1,已连通 
        //更新路径最短 
        for(int j = 0; j < n; j++)
            if(!vis[j] && dis[j] > dis[k]+e[k][j])
                dis[j]=dis[k]+e[k][j];
    }
}

int main()
{
    while(cin>>n>>m)
    {
        int u,v,w;
        //初始化 
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++)
                e[i][j] = 19920603;
                
        //赋值 
        for(int i = 0; i < m; i++)
        {
            cin>>u>>v>>w;
            if(e[u][v] > w)
                e[u][v] = e[v][u] = w;
        }
        cin>>s>>t;//s起点,t终点 
        Dijkstra(s);
        if(dis[t] == 19920603)
            cout<<"?"<<endl;
        else
            cout<<dis[t]<<endl;
    }
    return 0;
}

 

posted on 2018-11-24 20:49  Sakura晞月  阅读(172)  评论(0)    收藏  举报