(一)
题目描述:
输入6个顶点,9条边,求源点1到5的最短路径 。(有向网)
样例输入:
6 9
1 2 7
1 3 9
1 6 14
2 3 10
2 4 15
3 6 2
5 6 9
4 5 6
3 4 11
样例输出:
26
样例示意图:
参考代码:
#include <stdio.h>
#include <string.h>
#define INF 65535
int n,m;
int map[7][7];
int visited[7];
int dist[7];
void init()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=INF;
}
}
void dijkstra(int s)
{
memset(visited,0,sizeof(visited));
int i,j;
for(i=1;i<=n;i++)
dist[i]=map[s][i];
for(i=1;i<n;i++)
{
int min=INF,pos;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&dist[j]<min)
{
min=dist[j];
pos=j;
}
}
visited[pos]=1;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&dist[j]>dist[pos]+map[pos][j])
dist[j]=dist[pos]+map[pos][j];
}
}
}
int main()
{
scanf("%d%d",&n,&m);
init();
int i,x,y,z;
for(i=0.;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
map[x][y]=z;//有向网
}
dijkstra(1);
printf("%d",dist[5]);
return 0;
}
(二)
题目描述:
输入6个顶点,9条边,求源点1到5的最短路径 。(无向网)
样例输入:
6 9
1 2 7
1 3 9
1 6 14
2 3 10
2 4 15
3 6 2
5 6 9
4 5 6
3 4 11
样例输出:
20
样例示意图:
参考代码:
#include <stdio.h>
#include <string.h>
#define INF 65535
int n,m;
int map[7][7];
int dist[7];
int visited[7];
void init()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=INF;
}
}
void dijkstra(int s)
{
memset(visited,0,sizeof(visited));
int i,j;
for(i=1;i<=n;i++)
dist[i]=map[s][i];
for(i=1;i<n;i++)
{
int min=INF,pos;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&dist[j]<min)
{
min=dist[j];
pos=j;
}
}
visited[pos]=1;
for(j=1;j<=n;j++)
{
if(visited[j]==0&&dist[j]>dist[pos]+map[pos][j])
dist[j]=dist[pos]+map[pos][j];
}
}
}
int main()
{
scanf("%d%d",&n,&m);
init();
int i,x,y,z;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
map[x][y]=map[y][x]=z;//无向网。
}
dijkstra(1);
printf("%d",dist[5]);
return 0;
}
本题主要带大家回顾了一下dijkstra算法的流程,是两道纯模板题,非常简单。
好了,本次的分享就先到这,大家有任何疑问或建议,欢迎在评论区留言,我们下期再见!