0
点赞
收藏
分享

微信扫一扫

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


图结构练习——最短路径

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;
}

 

举报

相关推荐

0 条评论