您的位置:首页 > 其它

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

2015-11-03 14:41 567 查看
题目地址

题目大意:给出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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: