OJ2143图结构练习——最短路径(迪杰斯特拉算法)

来源:互联网 发布:c3p0连接池配置优化 编辑:程序博客网 时间:2024/05/01 15:23

图结构练习——最短路径

Time Limit: 1000MS Memory limit: 65536K

题目描述

 给定一个带权无向图,求节点1到节点n的最短路径。
 

输入

 输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
 

输出

 每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
 

示例输入

3 21 2 11 3 11 0

示例输出

10

提示

         边与边的权值也要取最小值,切记切记,不然就不对

来源

 赵利强

示例程序

 
#include<stdio.h>#include<stdlib.h>#include<string.h>#define INF 999999999int p[105][105],vis[105],dis[105];int n;void Dijkstra(int e){    int i,min,c,v,j,u;    for(i=1; i<=n-1; i++)    {        min=INF;        for(j=1; j<=n; j++)        {            if(vis[j]==0&&dis[j]<min)            {                min=dis[j];                u=j;            }        }        vis[u]=1;        for(v=1; v<=n; v++)        {            if(p[u][v]<INF)            {                if(dis[v]>dis[u]+p[u][v])                    dis[v]=dis[u]+p[u][v];            }        }    }    printf("%d\n",dis[n]);}int main(){    int i,j,k,l,m,a,b,c;    while(~scanf("%d%d",&n,&m))    {        memset(vis,0,sizeof(vis));        for(i=1; i<=n; i++)            for(j=1; j<=n; j++)                if(i==j)                    p[i][j]=0;                else p[i][j]=INF;        while(m--)        {            scanf("%d%d%d",&a,&b,&c);            if(p[a][b]>c)<span style="font-family: 微软雅黑, 黑体, 宋体, Verdana, Helvetica, Arial, Geneva, sans-serif;">//判断是不是两点之间的最小权值</span>            {                p[a][b]=c;                p[b][a]=c;            }        }        vis[1]=1;        for(i=1; i<=n; i++)//初始dis数组            dis[i]=p[1][i];        Dijkstra(1);    }}


0 0
原创粉丝点击