迪杰斯特拉Dijkstra

#include<bits/stdc++.h>
using namespace std;
struct E{//邻接链表 
	int next;
	int cost;//代价 
};
vector<E> edge[1005];
int dis[1005];
bool mark[1005];
int main(){
	int m,n,a,b,c;
	while(cin>>n>>m){//顶点数和边数 
		for(int i=1;i<=n;i++){
			edge[i].clear();//初始化
			dis[i]=-1;
			mark[i]=false; 
		} 
		while(m--){
			cin>>a>>b>>c;//a到b有一条权值为c的路径
			E tmp;
			tmp.cost=c;
			tmp.next=b;
			edge[a].push_back(tmp);//把b加入a的邻接链表
			tmp.next=a;
			edge[b].push_back(tmp);//把a加入b的邻接链表 
		}
		int newP=1;
		dis[newP]=0;
		mark[newP]=true;
		for(int i=1;i<n;i++){//n-1次更新dis 
			for(int j=0;j<edge[newP].size();j++){
				int t=edge[newP][j].next;
				int cost=edge[newP][j].cost;
				if(mark[t]==true)continue;
				if(dis[t]==-1||cost+dis[newP]<dis[t]){
					dis[t]=dis[newP]+cost;
				}
			}
			int min=100000;
			for(int j=1;j<=n;j++){
				if(mark[j]==true||dis[j]==-1)continue;
				if(dis[j]<min){
					min=dis[j];
					newP=j;//起点的更新 
				}
			} 
			mark[newP]=true;
		}
		for(int k=1;k<=n;k++){
			cout<<dis[k]<<" ";
		} 
		cout<<endl;
	}
	return 0; 
}
发布了55 篇原创文章 · 获赞 100 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/chaokudeztt/article/details/104775264