SDUT2143图结构练习——最短路径

    xiaoxiao2026-09-09  7

    图结构练习——最短路径

    Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

    题目描述

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

     

    输入

     输入包含多组数据,格式如下。

    第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)

    剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。

     

    输出

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

     

    示例输入

    3 2 1 2 1 1 3 1 1 0

    示例输出

    1 0

    提示:看了Floyd算法才发现这个题太简单了。

    必须参考网址Floyd算法,就是用vis更快的找到从i到k的距离path,然后又用vis找到k到j的距离;

     

    来源

     赵利强

    示例程序

     

    ///*****请参考提示里的链接,不然看解释也看不懂; #include <stdio.h> #include <string.h> #define Inf 0x3f3f3f3f int map[105][105],vis[105],path[105]; void dijkstra(int n,int begin,int end) { for(int i=1; i<=n; i++) { path[i]=map[begin][i]; }///*************将i到中间位置的距离全部表示出来; vis[begin]=1; path[begin]=0; int t; for(int i=2; i<=n; i++) { int min=Inf; for(int j=1; j<=n; j++) { if(!vis[j]&&path[j]<min) { min=path[j]; t=j; } }///找到i到中间点t的最短距离; vis[t]=1; for(int k=1; k<=n; k++) { if(!vis[k]) { if(path[t]+map[t][k]<path[k]) path[k]=path[t]+map[t][k]; } }///找到中间点t到k点的最短距离; } printf("%d\n",path[end]); } int main() { int n,m,v,u,c; while(~scanf("%d%d",&n,&m)) { if(m==0) printf("0\n"); else { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(j==i) map[i][j]=0; else map[i][j]=Inf; } memset(vis,0,sizeof(vis)); for(int i=1; i<=m; i++) { scanf("%d%d%d",&v,&u,&c); if(map[v][u]>c) map[v][u]=map[u][v]=c; } dijkstra(n,1,n); } } return 0; }

     

    转载请注明原文地址: https://ju.6miu.com/read-1311906.html
    最新回复(0)