您的位置:首页 > 其它

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

2016-08-16 20:19 363 查看


图结构练习——最短路径




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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: