P3371 题解
using cpp
(C) By: Luogu@kevinbzy(355701)
这道题很模板化,用 SPFA 模板就可以 AC。
SPFA 模板:
void spfa(){
for(int i=1;i<=n;i++){
d[i]=2147483647;
}
queue<int> q;
q.push(st);
vis[st]=1;
d[st]=0;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i].v;
int w=adj[u][i].w;
if(d[u]+w<d[v]){
d[v]=d[u]+w;
if(vis[v]==0){
vis[v]=1;
q.push(v);
}
}
}
}
}
在 main() 主函数中调用函数 spfa() 函数就可以实现功能
由于题目中说是 有向图 ,所以要建一个单向图:
cin>>n>>m>>st;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
adj[u].push_back(s(v,w));
}
另外,如果题目中说是 无向图 ,那么就要建一个双向图:
cin>>t>>c>>ts>>te;
for(int i=1;i<=c;i++){
int u,v,w;
cin>>u>>v>>w;
adj[u].push_back(s(v,w));
adj[v].push_back(s(u,w));
}
初始化 & 头文件:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct s{
int v,w;
s(int v,int w):v(v),w(w){}
};
vector<s> adj[500005];
int d[10005],vis[10005],m,u,st,n;
输出:
for(int i=1;i<=n;i++){
cout<<d[i]<<' ';
}
整体代码:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct s{
int v,w;
s(int v,int w):v(v),w(w){}
};
vector<s> adj[500005];
int d[10005],vis[10005],m,u,st,n;
void spfa(){
for(int i=1;i<=n;i++){
d[i]=2147483647;
}
queue<int> q;
q.push(st);
vis[st]=1;
d[st]=0;
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i].v;
int w=adj[u][i].w;
if(d[u]+w<d[v]){
d[v]=d[u]+w;
if(vis[v]==0){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main(){
cin>>n>>m>>st;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
adj[u].push_back(s(v,w));
}
spfa();
for(int i=1;i<=n;i++){
cout<<d[i]<<' ';
}
return 0;
}