资深天翼
#include <bits/stdc++.h>
#define re register
using namespace std;
inline int read() {
int X=0,w=1; char c=getchar();
while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
return X*w;
}
struct Edge { int v,w,nxt; };
Edge e[500010];
int head[100010],cnt=0;
inline void addEdge(int u,int v,int w) {
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int n,m,s;
int dis[100010];
struct node {
int u,d;
bool operator <(const node& rhs) const {
return d>rhs.d;
}
};
inline void Dijkstra() {
for (re int i=1;i<=n;i++) dis[i]=2147483647;
dis[s]=0;
priority_queue<node> Q;
Q.push((node){s,0});
while (!Q.empty()) {
node fr=Q.top(); Q.pop();
int u=fr.u,d=fr.d;
if (d!=dis[u]) continue;
for (re int i=head[u];i;i=e[i].nxt) {
int v=e[i].v,w=e[i].w;
if (dis[u]+w<dis[v]) {
dis[v]=dis[u]+w;
Q.push((node){v,dis[v]});
}
}
}
}
int main() {
n=read(),m=read(),s=read();
for (re int i=1;i<=m;i++) {
int X=read(),Y=read(),Z=read();
addEdge(X,Y,Z);
}
Dijkstra();
for (re int i=1;i<=n;i++) printf("%d ",dis[i]);
return 0;
}
0分代码
中级天翼
@沈峻宇
这是。。。队列!!!
难以想象!!!
你。。。
好吧,题目是看懂了,但你的代码把我搞蒙了。。。
输入要用位运算吗?
这里:
bool operator <(const node& rhs) const {
return d>rhs.d;
}
既然你都定义成const了,那你做这个函数有设么用?
顺便解释一下:const:静态的
这题我觉得用BFS就行了啊。。。
太厉害了!!!!
高级天翼