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

来源:互联网 发布:淘宝桔子表行靠谱不 编辑:程序博客网 时间:2024/05/28 03:03

题目地址

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

解题思路:1.允许有负权边,可以判断负环

                  2.时间复杂度:O(ke),k指的是所有顶点的进队的平均次数,可以证明k<=2,e为边数

                  3.可以用SPFA来存在是否存在环,如果是的话就是存在一条边的松弛操作大于等于n。

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <vector>#include <queue>#include <utility>using namespace std;const int INF=0xfffffff;const int maxn=200+10;int n,m;int mp[maxn][maxn];int dis[maxn];void SPFA(int s){    for(int i=0;i<n;i++)        dis[i]=INF;    bool vis[maxn]={0};    vis[s]=true;    dis[s]=0;    queue<int> q;    q.push(s);    while(!q.empty())    {        int cur=q.front();        q.pop();        vis[cur]=false;        for(int i=0;i<n;i++)        {            if(dis[cur] + mp[cur][i] < dis[i])            {                dis[i]=dis[cur] + mp[cur][i];                if(!vis[i])                {                    q.push(i);                    vis[i]=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[from][to] = mp[to][from] = val;        }        int s,t;        scanf("%d%d",&s,&t);        SPFA(s);        dis[t]==INF ? printf("-1\n") : printf("%d\n",dis[t]);    }    return 0;}




 

0 0
原创粉丝点击