点有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;
}