diff --git "a/\350\277\252\346\235\260\346\226\257\347\211\271\346\213\211" "b/\350\277\252\346\235\260\346\226\257\347\211\271\346\213\211" new file mode 100644 index 0000000000000000000000000000000000000000..f36c308362abd19365fddd35a329aa0f4766783a --- /dev/null +++ "b/\350\277\252\346\235\260\346\226\257\347\211\271\346\213\211" @@ -0,0 +1,61 @@ +/*我写过一个关于最短路的博客,很全 + https://blog.csdn.net/struct_cym/article/details/120106356?spm=1001.2014.3001.5501 + 别忘了顺便给我三连一下 +*/ +#include +#include +#include +#define INF 0x3f3f3f3f +using namespace std; + +const int N=1e3+10; + +int d[N],vs[N]; //d是该点距起点的距离,vs是这个点的距离是否被确定 + +struct Edge{ //邻接表 + int to;//所连接的点 + int w;//与所连接的点的距离 +}; + +vectoredge[N]; //构造邻接表 + +int n,m; + +void add(int u,int v,int w){//连接点和线 + edge[u].push_back({v,w}); + edge[v].push_back({u,w}); //如果是单向图就把这段删掉 +} + +int main(){ + while(cin>>n>>m&&n!=0&&m!=0){ //这是多样例输入 + int u,v,w; //u点距v点w远 + for(int i=1;i<=m;i++){ //连接 + cin>>u>>v>>w; + add(u,v,w); + } + for(int i=1;i<=n;i++){ //初始化 一开始所有点离起点都是无限远 + d[i]=INF; + vs[i]=0; + } + d[1]=0; //起点距起点一定是0 + for(int i=1;i<=n;i++){ + int x=0,m=INF; //找目前距起点最近的点 + for(int j=1;j<=n;j++){ + if(!vs[j]&&d[j]<=m){ //没有被找过且距离最小 + x=j; //标记 + m=d[j]; + } + } + vs[x]=1; //把目前离起点最近的点确定 + for(int j=0;j