您的位置:首页 > 其它

SDUT 2143 图结构练习——最短路径(Dijkstra 单源最短路径求解)

2017-10-14 21:22 459 查看

图结构练习——最短路径

Time Limit: 1000MS
Memory Limit: 65536KB
Submit

Statistic
Discuss

Problem Description

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

 

Input

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

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

Output

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

 

Example Input

3 2
1 2 1
1 3 1
1 0


Example Output

1
0


Hint

Dijkstra算法,求起点到任意一点的最短路径
#include<cstdio>
#include<cstring>
#define INF 9999999
using namespace std;
int dis[200],map[200][200];//保存起点到i的距离;保存x,y的距离
void dijkstra(int n)
{
for(int i=1;i<=n;i++)
dis[i]=map[1][i];
int vis[200];
memset(vis,0,sizeof(vis));
int min,k;
vis[1]=1;
for(int i=1;i<=n;i++)
{
min=INF;
k=1;
for(int j=1;j<=n;j++)//刷新起点到k的最小值
{
if(vis[j]==0&&min>dis[j])
{
min=dis[j];
k=j;
}
}
vis[k]=1;
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[k]+map[k][i])
dis[i]=dis[k]+map[k][i];
}
}
printf("%d\n",dis
);
}
int main()
{
int n,m,x,y,va;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
map[i][i]=0;
else
map[i][j]=INF;
}
}
memset(dis,0,sizeof(dis));
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&x,&y,&va);
if(va<map[x][y])
map[x][y]=map[y][x]=va;
}
dijkstra(n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: