SPFA(模板)

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

void print(int x) {
 if(x<0) {
  putchar('-');
  x=-x;
 }
 if(x>9)
  print(x/10);
 putchar(x%10+'0');
}
void read(int &x) {
 int f=1;
 x=0;
 char s=getchar();
 while(s<'0'||s>'9') {
  if(s=='-')f=-1;
  s=getchar();
 }
 while(s>='0'&&s<='9') {
  x=x*10+s-'0';
  s=getchar();
 }
 x*=f;
}
vector<int> to[10001], dis[10001];
queue<int> now;
int f[10001];
int main()
{
 int n, m, s;
 read(n), read(m), read(s);
 for(register int i=0; i<=n; ++i) f[i]=0x7fffffff;
 f[s]=0;
 now.push(s);
 for(register int i=0; i<m; ++i)
 {
  int a, b, c;
  read(a), read(b), read(c);
  to[a].push_back(b);
  dis[a].push_back(c);
 }
 do
 {
  int tmp=now.front();
  now.pop();
  for(register int i=0; i<to[tmp].size(); ++i)
  {
   if(f[tmp]+dis[tmp][i]<f[to[tmp][i]])
   {
    f[to[tmp][i]]=f[tmp]+dis[tmp][i];
    now.push(to[tmp][i]);
   }
  }
 }while(!now.empty());
 for(register int i=1; i<=n; ++i)
 {
  print(f[i]);
  putchar(' ');
 }
 return 0;
}

```

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值