HDU 1874 Dijkstra模板

来源:互联网 发布:穿越火线手游mac版 编辑:程序博客网 时间:2024/05/09 04:27

迪杰斯特拉是用于最短路径搜索的算法,求出的是一个节点到其他所有节点的最短路径,跟普利姆算法很相似。


#include<stdio.h>#include<string.h>#define inf 1<<28using namespace std;int mp[250][250];int dis[250];bool vis[250];void djs(int n,int s,int t){    int i,j;    memset(vis,0,sizeof(vis));    for(i=0;i<n;i++)    {        dis[i]=mp[s][i];    }    vis[s]=1;    int k=s,mini;    for(i=0;i<n-1;i++)    {        for(j=0;j<n;j++)        {            //更新dis数组            if(!vis[j]&&dis[k]+mp[k][j]<dis[j])                dis[j]=dis[k]+mp[k][j];        }        //找最小值        mini=inf;        for(j=0;j<n;j++)        {            if(!vis[j]&&dis[j]<mini)                mini=dis[k=j];        }        vis[k]=1;    }    if(dis[t]==inf)         //若未连通        printf("-1\n");    else        printf("%d\n",dis[t]);}int main(){    int m,n,i,j;    int a,b,c;    while(~scanf("%d%d",&n,&m))    {        //初始化        for(i=0;i<n;i++)        {            for(j=0;j<n;j++)            {                if(i==j)                    mp[i][j]=0;                else                    mp[i][j]=inf;            }        }                                       for(i=0;i<m;i++)        {            scanf("%d%d%d",&a,&b,&c);            if(mp[a][b]>c)              //路径可能有多条,选最短            {                mp[a][b]=c;                mp[b][a]=c;            }        }        int s,t;        scanf("%d%d",&s,&t);        djs(n,s,t);    }return 0;}


0 0
原创粉丝点击