乐于助人了属于是最短路求助我帮忙
  • 板块灌水区
  • 楼主itisover
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/10/11 10:25
  • 上次更新2023/11/4 04:05:43
查看原帖
乐于助人了属于是最短路求助我帮忙
186045
itisover楼主2021/10/11 10:25

OIer @a3153691779 想到了可以用set做了最短路,但是它又AC又TLE了,因为他还没学会拼音,现在他请求我来帮他发求助帖

有任何问题请D他不要D我,谢谢

这是他的评测记录:

https://www.luogu.com.cn/record/58236851

这是他的代码:

#include<iostream>
#include<set>
#include<cstring>
#define int long long
using namespace std;
const int N=5e5+5;
struct ed
{
  int last;
  int to;
  int dis;
}edge[N<<1];
int num,h[N],d[N],dis[N],s;
bool b[N];
struct cmp
{
  bool operator()(int x,int y)
  {
    return d[x]<d[y];
  }
};
set<int,cmp> a;
void add(int x,int y,int z)
{
  edge[++num].last=h[x];
  edge[num].to=y;
  edge[num].dis=z;
  h[x]=num;
}
void dfs(int x)
{
  if(a.empty()&&x!=s)return;
  for(int i=h[x];i;i=edge[i].last)
    {
      int v=edge[i].to;
      if(b[v])continue;
      d[v]=min(d[v],d[x]+edge[i].dis);      
      a.insert(v);
    }
  int k=*a.begin();
  a.erase(a.begin());
  b[k]=1;
  dfs(k);
}
signed main()
{
  int n,m;
  cin>>n>>m>>s;
  for(int i=1;i<=m;++i)
    {
      int x,y,z;
      cin>>x>>y>>z;
      add(x,y,z);
    }
  memset(d,0x1f,sizeof(d));
  d[s]=0;b[s]=1;
  dfs(s);
  for(int i=1;i<=n;++i)
    cout<<d[i]<<" ";
  return 0;
}
2021/10/11 10:25
加载中...