点有2500个,边只有6200个,是稀疏图,于是决定学一下spfa
spfa板子题,直接上代码了
心得就是稍微学了一下stl()
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 2550;
const int INF = 9999999;
struct node{
int v;//终点
int weight;//权值
};
vector<node>mp[maxn];//下标是起点
int dis[maxn],vis[maxn];//dis是起点到下标的长,vis判断是否入队过
void spfa(int src){
int q;
queue<int>Q;
dis[src]=0;
vis[src]=1;
Q.push(src);
while(!Q.empty()){
q=Q.front();
Q.pop();
vis[q]=0;
for(int i=0;i<mp[q].size();i++){
if(dis[q]+mp[q][i].weight<dis[mp[q][i].v]){
dis[mp[q][i].v]=dis[q]+mp[q][i].weight;
if(!vis[mp[q][i].v]){
Q.push(mp[q][i].v);
vis[mp[q][i].v]=1;
}
}
}
}
return;
}
int main(){
int t,c,ts,te;
cin>>t>>c>>ts>>te;
for(int i=1;i<=t;i++)
dis[i]=INF;
while(c--){
int a,b,tmp;
scanf("%d %d %d",&a,&b,&tmp);
mp[a].push_back((node){b,tmp});
mp[b].push_back((node){a,tmp});
}
spfa(ts);
printf("%d\n",dis[te]);
return 0;
}
京公网安备 11010502036488号