hdu 1874 畅通工程续(最短路Dij邻接矩阵)

来源:互联网 发布:java axis简单入门 编辑:程序博客网 时间:2024/06/01 19:07

题目地址

题目大意:给出n个点m条边,并给出起点和终点,求起点到终点的最短路

解题思路:1.没有负边权

                  2.复杂度n^2(n为点的个数)

                  3.起点固定,不断更新终点,若要输出路径,则需要逆序输出

                  4.适用于有向图和无向图

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <vector>using namespace std;const int maxn=200+10;const int INF=0xfffffff;int n,m,mp[maxn][maxn],dis[maxn];bool vis[maxn];void dijkstra(int s){    memset(vis,0,sizeof(vis));    int cur=s;    dis[cur]=0;    vis[cur]=1;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)            if(!vis[j] && dis[cur] + mp[cur][j] < dis[j])                dis[j]=dis[cur] + mp[cur][j];        int minn=INF;        for(int j=0;j<n;j++)            if(!vis[j] && dis[j] < minn)                minn=dis[cur=j];        vis[cur]=true;    }}int main(){    while(scanf("%d%d",&n,&m) != EOF)    {        for(int i=0;i<n;i++)          {              dis[i]=INF;              for(int j=0;j<n;j++)                  i==j ? mp[i][j]=0 : mp[i][j]=INF;          }          for(int i=0;i<m;i++)          {              int from,to,val;              scanf("%d%d%d",&from,&to,&val);             if(mp[from][to] > val) ///很重要,更小才需要更新                mp[to][from]=mp[from][to]=val;                  }          int s,t;        scanf("%d%d",&s,&t);        dijkstra(s);        dis[t]==INF ? printf("-1\n") : printf("%d\n",dis[t]);    }    return 0;}

0 0
原创粉丝点击