试题 算法训练 SPFA
提交此题 评测记录
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
SPFA
输入格式
第一行输入n,m;第二行输入begin,end
接下来m行输入x,y,z;
n表示点数,m表示边数,begin表示起始点,end表示目标点,x、y表示连同连点z表示权值
输出格式
输出begin到end的最短路
样例输入
7 12
1 7
1 7 10
1 2 1
1 3 2
2 7 8
2 3 1
2 4 4
2 5 1
2 6 10
3 4 3
5 6 1
5 4 7
6 7 1
样例输出
4
数据规模和约定
n,m<10^6
解题思路:SPFA算法解题。
代码如下:
#include <iostream>
#include <queue>
#include <string.h>
#include <vector>
using namespace std;struct Edge{int from,to;int W;Edge(int ff,int tt,int ww):from(ff),to(tt),W(ww){ }Edge(){ }
};vector< vector<Edge> > G(1000006);
int n,m;
int Begin,End;int inq[1000006];
int d[1000006];void Read(){cin>>n>>m;cin>>Begin>>End;for(int i=1;i<=n;i++){d[i]=8888;}for(int i=0;i<m;i++){int x,y,z;cin>>x>>y>>z;G[x].push_back(Edge(x,y,z));G[y].push_back(Edge(y,x,z));}memset(inq,0,sizeof(inq));}void SPFA(int Beg){queue<int> Q;Q.push(Beg);d[Beg]=0;inq[Beg]=1;while(!Q.empty()){int now=Q.front();Q.pop();inq[now]=0;int to;for(int i=0;i<G[now].size();i++){to=G[now][i].to;if(d[to]>d[now]+G[now][i].W ){d[to]=d[now]+G[now][i].W;if( inq[to]==1 )continue;inq[to]=1;Q.push(to);}}} cout<<d[End]<<endl;}int main(int argc, char** argv) {Read();SPFA(Begin);// cout<<"hello world!"<<endl;return 0;
}
#include <iostream>
#include <queue>
#include <string.h>
#include <vector>
using namespace std;
struct Edge{
int from,to;
int W;
Edge(int ff,int tt,int ww):from(ff),to(tt),W(ww){ }
Edge(){ }
};
vector< vector<Edge> > G(1000006);
int n,m;
int Begin,End;
int inq[1000006];
int d[1000006];
void Read(){
cin>>n>>m;
cin>>Begin>>End;
for(int i=1;i<=n;i++){
d[i]=8888;
}
for(int i=0;i<m;i++){
int x,y,z;
cin>>x>>y>>z;
G[x].push_back(Edge(x,y,z));
G[y].push_back(Edge(y,x,z));
}
memset(inq,0,sizeof(inq));
}
void SPFA(int Beg){
queue<int> Q;
Q.push(Beg);
d[Beg]=0;
inq[Beg]=1;
while(!Q.empty()){
int now=Q.front();
Q.pop();
inq[now]=0;
int to;
for(int i=0;i<G[now].size();i++){
to=G[now][i].to;
if(d[to]>d[now]+G[now][i].W ){
d[to]=d[now]+G[now][i].W;
if( inq[to]==1 )
continue;
inq[to]=1;
Q.push(to);
}
}
}
cout<<d[End]<<endl;
}
int main(int argc, char** argv) {
Read();
SPFA(Begin);
// cout<<"hello world!"<<endl;
return 0;
}