const int MAXN=1e1+10;
//最大点数
struct Edge{
int to,val;
Edge(int to_point=0,int value=0):to(to_point),val(value){};
bool operator<(const Edge&b)const{return val>b.val;};
};
vector<Edge>e[MAXN];
bool vised[MAXN];
int dist[MAXN];//答案
void Dijkstra(int start){
memset(vised,0,sizeof(vised));
memset(dist,0x3f3f3f3f,sizeof(dist));
dist[start]=0;
priority_queue<Edge>que;
que.push(Edge(start,0));
while(!que.empty()){
Edge t=que.top();
que.pop();
int tmp_point=t.to;//临时节点,一般都已加入start节点集合
if(vised[tmp_point])continue;//判断是否已加入
vised[tmp_point]=1;
for(int i=0;i<e[tmp_point].size();++i){
int to=e[tmp_point][i].to;
int va=e[tmp_point][i].val;
if(!vised[to]&&dist[to]>dist[tmp_point]+va){
dist[to]=dist[tmp_point]+va;
que.push(Edge(to,dist[to]));
}
}
}
}
inline void add(int x,int y,int val){//加边
e[x].push_back(Edge(y,val));
}
int main() {
int n,m,s;//点数、边数、起点
read(n),read(m),read(s);
int x,y,v;
while(m--){
read(x),read(y),read(v);
add(x,y,v);
}
Dijkstra(s);//调用
for(int i=1;i<=n;++i){
printf("%d ",dist[i]);
}
return 0;
}
Dijkstra_nlogn模板
最新推荐文章于 2022-11-21 10:31:53 发布