畅通工程续

 hdoj 1874

题目大意:给出一个有向图,求从某点到另一点的最短路径

解决:迪杰斯特拉求単源点到其它点的最短路径

#include <iostream>
using namespace std;
#define N 200
#define MAX 0xffffff
int cost[N+10][N+10];
int vis[N+10];
int dist[N+10];
int n;
void init()
{
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
       cost[i][j]=MAX;
}
int dijistra(int start,int end)
{
    for(int i=0;i<n;i++)
    {
        dist[i]=cost[start][i];
        vis[i]=false;
    }
    vis[start]=1;
    dist[start]=0;
    int pre;
    for(int i=1;i<n;i++)
    {
        int min=MAX;
        for(int j=0;j<n;j++)
           if(!vis[j] && dist[j]<min){min=dist[j];pre=j;}
        vis[pre]=1;
        for(int j=0;j<n;j++)
        if(!vis[j] && min+cost[pre][j]<dist[j])
        {
            dist[j]=min+cost[pre][j];
        }
    }
    return dist[end];
}
int  main()
{
    int m;
    while(cin>>n>>m)
    {
        int i,a,b,w;
        init();
        for(i=0;i<m;i++)
        {//刚开始一直wa,就是因为没写这句话
            cin>>a>>b>>w;
            if(w<cost[a][b])
            {
                cost[a][b]=cost[b][a]=w;
            }
        }
       cin>>a>>b;
      
       int ret=dijistra(a,b);
       if (ret==MAX)cout<<"-1"<<endl;
       else  cout<<ret<<endl;
    }
  //  system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/hpustudent/p/2136788.html