好像经过堆优化它又活了
以下是码
#include<bits/stdc++.h>
using namespace std;
#define ri register int
#define MAXM 4000100
#define MAXN 1000100
#define INF 2147483647
struct node
{
int from,to,dis;
} edge[MAXN];
int cnt,head[MAXM],n,m,s,dist[MAXN];
bool vis[MAXN];
inline void add(int from,int to,int dis)
{
edge[++cnt].from=head[from];
edge[cnt].dis=dis;
edge[cnt].to=to;
head[from]=cnt;
}
template <typename T> inline void read (T &x)
{
x=0;
int f=1;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=-1;
for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^48);
if(f<0) x=-x;
}
template <typename T> inline void write(T x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void SPFA(int s)
{
priority_queue< pair< int,int > > q;
q.push(make_pair(0,s));
for(ri i=1;i<=n;++i)
{
dist[i]=INF;
}
dist[s]=0;
vis[s]=1;
while(!q.empty())
{
int now=q.top().second;
q.pop();
vis[now]=0;
for(ri i=head[now]; i; i=edge[i].from)
{
int v=edge[i].to;
if(dist[v]>dist[now]+edge[i].dis)
{
dist[v]=dist[now]+edge[i].dis;
if(!vis[v])
{
q.push(make_pair(-dist[v],v));
vis[v]=1;
}
}
}
}
}
int main()
{
read(n);
read(m);
read(s);
int u,v,t;
for(ri i=1; i<=m; ++i)
{
read(u);
read(v);
read(t);
add(u,v,t);
}
SPFA(s);
for(ri i=1; i<=n; ++i)
{
write(dist[i]);
putchar(' ');
}
}
而且还进了最优解第三页。
这波怎么评价,考试的时候能放心写这个吗(不包括负环情况)