单源最短路径(dij+堆优化)

单源最短路径的模板题,感谢同学余能的帮助~

#include<bits/stdc++.h>
#define inf 2147483647
using namespace  std;
bool book [200004];
int cnt=0;
int head[200020];
int n,m,qq;

struct Edge
{
   int to,next,w;
}e[2000005];

struct Dis
{
     int to,w;
}dis[20000];

struct cmp1
{
   bool operator () (Dis &a,Dis &b){
      return a.w>b.w;
   }
};

priority_queue<Dis ,vector<Dis>, cmp1> q;
void add(int a,int b,int c)
{
     e[++cnt].to=b;
     e[cnt].w=c;
     e[cnt].next=head[a];
     head[a]=cnt;
}

void dijkstra(int k)
{
    for(int i=1;i<=n;i++)
    {
	   dis[i].to=i;
	   dis[i].w=inf;
	}
	dis[k].w=0;
	q.push(dis[k]);
    book[0]=1;
	while(!q.empty())
	{
	   Dis t=q.top();q.pop();
	   int x=t.to; 
	   if(book[x]) continue;
	   book[x]=1;
	   for(int i=head[x];i;i=e[i].next)
	   {
	      int j=e[i].to;
		  if(dis[j].w>dis[x].w+e[i].w&&!book[j])
	      {
		     dis[j].w=dis[x].w+e[i].w;
		     q.push(dis[j]);
		  }
	   }
	}	
}

int main()
{
   cin>>n>>m>>qq;
   int t1,t2,t3;
   for(int i=1;i<=m;i++)
   {
      cin>>t1>>t2>>t3;
      add(t1,t2,t3);
   }
   dijkstra(qq);
   for(int i=1;i<=n;i++)
     cout<<dis[i].w<<" ";
   return 0;
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值