题目
设有nnn个城市,依次编号为0,1,2,…n−10,1,2,\dots n-10,1,2,…n−1(n≤100n\leq100n≤100),另外有一个文件保存nnn个城市之间的距离(每座城市之间的距离都≤1000\leq 1000≤1000)。当两城市之间的距离等于-1时,表示这两个城市没有直接连接。求指定城市kkk到每一个城市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;
}