题目
设有 n n n个城市,依次编号为 0 , 1 , 2 , … n − 1 0,1,2,\dots n-1 0,1,2,…n−1( n ≤ 100 n\leq100 n≤100),另外有一个文件保存 n n n个城市之间的距离(每座城市之间的距离都 ≤ 1000 \leq 1000 ≤1000)。当两城市之间的距离等于-1时,表示这两个城市没有直接连接。求指定城市 k k k到每一个城市 i ( 0 ≤ I , k ≤ n − 1 ) i(0\leq I,k\leq n-1) i(0≤I,k≤n−1)的最短距离。
分析
dijkstra走起
代码
#include <cstdio>
#include <cstring>
using namespace std;
int n,low[202],f[202][202],ans=2147483647,l; bool b[202];
int main(){
scanf("%d",&n); scanf("%d",&l); l++;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) {
scanf("%d",&f[i][j]);
if (f[i][j]==-1) f[i][j]=2147483647;//不能直接连通(0是没有距离)
}
memset(b,0,sizeof(b)); b[l]=1;
for (int i=1;i<=n;i++) low[i]=f[l][i];
for (int i=1;i<n;i++){
int minx=2147483647,k=0;
for (int j=1;j<=n;j++)
if (!b[j]&&low[j]<minx){minx=low[j];k=j;}
if (k==0) break; b[k]=1;
for (int j=1;j<=n;j++) if ((long long)low[k]+f[k][j]<low[j]) low[j]=low[k]+f[k][j];
} printf("%d",low[1]);
for (int i=2;i<=n;i++) printf(" %d",low[i]); return 0;
}