此种题型最为经典,可以有多种变化形式,但最终所需的模板总是万变不离其宗,这里复习一下模板,并有所改变。
Dijsktra:
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
#define INF 0x7f7f7f7f
#define maxn 100000
using namespace std;
int n,m;
struct Edge{
int from,to,dist;
};
struct HeapNode{
int d,u;
bool operator < (HeapNode rhs)const{
return d>rhs.d;
}
};
struct Dijkstra{
int n,m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
int d[maxn];
int p[maxn];
void init (int n){
this->n=n;
for (int i=0;i<n;i++) G[i].clear();
edges.clear();
}
void addedge(int from,int to,int dist){
edges.push_back((Edge){from,to,dist});
m=edges.size();
G[from].push_back(m-1);
}
void dijkstra(int s){
priority_queue<HeapNode> Q;
for (int i=0;i<n;i++) d[i]=INF;
d[s]=0;
memset(done,0,sizeof(done));
Q.push((HeapNode){0,s});
while (!Q.empty()){
HeapNode x=Q.top();Q.pop();
int u=x.u;
if (done[u])continue;
done[u]=true;
for (int i=0;i<G[u].size();i++){
Edge e=edges[G[u][i]];
if (d[e.to]>d[u]+e.dist){
d[e.to]=d[u]+e.dist;
p[e.to]=G[u][i];
Q.push((HeapNode){d[e.to],e.to});
}
}
}
}
}dis;
int v[maxn],w[maxn],u[maxn];
int main(){
freopen("input.in","r",stdin);
freopen("output.out","w",stdout);
scanf("%d %d",&n,&m);
dis.init(n);
for (int i=0;i<m;i++){
scanf("%d %d %d",&u[i],&v[i],&w[i]);
u[i]--;v[i]--;
dis.addedge(u[i],v[i],w[i]);
dis.addedge(v[i],u[i],w[i]);
}
dis.dijkstra(0);
for (int i=0;i<n;i++)
printf("%d ",dis.d[i]);
return 0;
}
Spfa:
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<vector>
#define maxn 100000
#define INF 0x7f7f7f7f
using namespace std;
int n,m;
struct Edge{
int to,dist;
};
struct Spfa{
int n,m;
bool inq[maxn];
int d[maxn];
vector<Edge> G[maxn];
void init(int n){
this->n=n;
for (int i=0;i<n;i++)G[i].clear();
}
void addedge(int u,int v,int w){
G[u].push_back((Edge){v,w});
G[v].push_back((Edge){u,w});
}
void spfa(int s){
queue<int> Q;
memset(inq,0,sizeof(inq));
for (int i=0;i<n;i++)d[i]=INF;
d[s]=0;
Q.push(s);inq[s]=true;
while (!Q.empty()){
int u=Q.front();Q.pop();
inq[u]=false;
for (int i=0;i<G[u].size();i++){
Edge e=G[u][i];
if (d[e.to]>d[u]+e.dist){
d[e.to]=d[u]+e.dist;
if (!inq[e.to]){
Q.push(e.to);
inq[e.to]=true;
}
}
}
}
}
}dis;
int u[maxn],v[maxn],w[maxn];
int main(){
freopen("input.in","r",stdin);
freopen("output.out","w",stdout);
scanf("%d %d",&n,&m);
dis.init(n);
for (int i=0;i<m;i++){
scanf("%d %d %d",&u[i],&v[i],&w[i]);
u[i]--;v[i]--;
dis.addedge(u[i],v[i],w[i]);
dis.addedge(v[i],u[i],w[i]);
}
dis.spfa(0);
for (int i=0;i<n;i++)
printf("%d ",dis.d[i]);
return 0;
}