题目:单源最短路径
思路:
据说spfa死了,当时在庆幸用了这么多年的dijkstra还活得好好的,然而写费用流发现不会spfa……
然后就开始恶补spfa了……
代码:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x);
#define maxn 10000
#define inf 2147483647
struct Edge{
int x,y,z;
Edge() {}
Edge(int xx,int yy,int zz) {
x=xx,y=yy,z=zz;
}
};
int n,m,s;
vector<Edge> g[maxn+5];
queue<int> que;
bool use[maxn+5];
int dist[maxn+5];
void spfa() {
for(int i=1;i<=n;i++) dist[i]=inf;
que.push(s);
use[s]=true;
dist[s]=0;
while(!que.empty()) {
int x=que.front();que.pop();
use[x]=false;
for(int i=0;i<g[x].size();i++) {
Edge y=g[x][i];
if(dist[x]!=inf&&dist[x]+y.z<dist[y.y]) {
dist[y.y]=dist[x]+y.z;
if(!use[y.y]) {
use[y.y]=true;
que.push(y.y);
}
}
}
}
}
void readin() {
read(n);read(m);read(s);
for(int i=1;i<=m;i++) {
int x,y,z;
read(x);read(y);read(z);
g[x].push_back(Edge(x,y,z));
}
}
void print() {
for(int i=1;i<=n;i++) printf("%d ",dist[i]);
}
int main() {
readin();
spfa();
print();
return 0;
}