您的位置:首页 > 其它

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

2015-11-03 14:29 323 查看
题目地址

题目大意:给出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: