输入n个点,m条边
计算1到各个点最近距离
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <ctype.h>
using namespace std;
int main(){
int dis[100];
int e[100][100];
int book[100];
int inf=99999999;
int n,m;
cin>>n>>m; // n个点 m个线路
for (int i=1; i<=n; i++) {
for (int j=1;j<=n; j++) { //初始化各个边
if (i==j) {
e[i][j]=0;
}
else
e[i][j]=inf;
}
}
for (int i=1; i<=m; i++) { //输入各个边的值
int a,b,c;
cin>>a>>b>>c;
e[a][b]=c;
}
for (int i=1; i<=n; i++) { //初始化标记数组book
book[i]=0;
}
book[1]=1;
for (int i=1; i<=n; i++) { //计算1到个边的长度
dis[i]=e[1][i];
}
for (int i=1; i<=n-1; i++) { //Dijkstra
int u;
int minx=inf;
for (int j=1; j<=n; j++) { //找到1最近的点u
if (book[j]==0 && dis[j]<minx) {
minx=dis[j]; //minx=dis[j]; 注意点出错过
u=j;
}
}
book[u]=1;
for (int v=1; v<=n; v++) { //重复寻找到个点到1最近距离
if(e[u][v]<inf){ //if(e[u][v]<inf){ 注意点 出错过
if (dis[v]>dis[u]+e[u][v]) {
dis[v]=dis[u]+e[u][v];
}
}
}
}
for (int i=1; i<=n; i++) {
cout<<dis[i]<<" ";
}
return 0;
}
//AC 结果