题目
一个图,输出从k点到每个点的最短路
输入
第一行有两个整数n和k,中间用空格隔开;以下是一个NxN的矩阵,表示点间的距离。
3 1
0 3 1
3 0 2
1 2 0
输出
输出点k到各点的距离
3 0 2
解题思路
用Dijkstra算法,注意点号是0到n-1。
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,t,s,a[101][101],lowa[101],k;
bool mark[101];
int main()
{
scanf("%d%d",&n,&k);
k++;//修正号
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]==0 || a[i][j]==-1) a[i][j]=233333333;//输入
}
for (int i=1;i<=n;i++)
{
lowa[i]=a[k][i];
mark[i]=false;
//每个点到点k的直接路
}
int u=1,mins=233333333;
mark[k]=true;//标记
while (u!=0)
{
mins=233333333;
u=0;
for (int i=1;i<=n;i++)
if (!mark[i] && lowa[i]<mins)
{
u=i;
mins=lowa[i];
//求到集合1的最短路径
}
mark[u]=true;//封路
if (u!=0)//如果找到了点
for (int i=1;i<=n;i++)
if (!mark[i] && lowa[u]+a[u][i]<lowa[i])
{
lowa[i]=lowa[u]+a[u][i];
//修正每个点的最短路
}
}
for (int i=1;i<=n;i++)
if (i==k) printf("0 ");
else if (lowa[i]<233333333) printf("%d ",lowa[i]);
else printf("-1 ");
//输出
}