首页 > 学院 > 开发设计 > 正文

图结构练习——最短路径

2019-11-08 18:23:51
字体:
来源:转载
供稿:网友

PRoblem Description

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

Input

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

Output

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

Example Input

3 21 2 11 3 11 0

Example Output

10

 

#include<stdio.h>#include<string.h>#include<stdlib.h>#define maxn 110#define max 0x3f3f3f3fint df[maxn][maxn];int book[maxn];int dist[maxn];int n;void dijkstra(int vo){    int i,j,k,min,u;    for(i=1;i<=n;i++)    {        dist[i]=df[vo][i];    }    book[vo]=1;    dist[vo]=0;    for(i=2;i<=n;i++)    {        min=max; u=vo;        for(j=1;j<=n;j++)        {            if(dist[j]<min&&book[j]==0)            {                u=j;                min=dist[j];            }        }        book[u]=1;        for(k=1;k<=n;k++)        {            if((dist[k]>dist[u]+df[u][k])&&book[k]==0&&df[u][k]<max)            {                dist[k]=dist[u]+df[u][k];            }        }    }}int main(){    int m;    int i,j,u,v,w;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(df,max,sizeof(df));        memset(book,0,sizeof(book));        for(i=1;i<=n;i++)        {            df[i][i]=0;        }        while(m--)        {            scanf("%d%d%d",&u,&v,&w);            if(df[u][v]>w)                df[u][v]=df[v][u]=w;        }        dijkstra(1);        printf("%d/n",dist[n]);    }    return 0;}

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表