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;
}