用SPFA求解最短路径问题

xiaoxiao2021-02-28  94

#include<iostream> #include<math.h> #include<algorithm> #include<queue> #include<map> #include<set> #include<stack> #include<string> #include<vector> using namespace std; #define INF 100000000 #define maxn 100010 struct edge{//对此算法统计最短路径条数,和最大点权不太清楚  int end,weight; }; struct node{  int id;  int pop;  vector<edge> bian; }; int pathnum[maxn]={0}; set<int> pre[maxn]; int city; int w[maxn]={0}; vector<node> ad; bool inq[maxn]={false};//记录是否在队列中 int d[maxn];//记录最短路径 int num[maxn]={0};//记录入队次数 bool SPFA(int s,int c){  fill(d,d+city,INF);  d[s]=0;  w[s]=ad[s].pop;  queue<node> q;  pathnum[s]=1;  q.push(ad[s]);     inq[s]=true;     num[s]++;     while(!q.empty())     {      node qw;      qw=q.front();      q.pop();      int id;   id=qw.id;      inq[id]=false;      for(int i=0;i<qw.bian.size();i++)      { int z;       z=d[id]+qw.bian[i].weight;      int k;   k=d[qw.bian[i].end];    int r=qw.bian[i].end;      if(k>z){       d[qw.bian[i].end]=z;       if(!inq[qw.bian[i].end]) {        q.push(ad[qw.bian[i].end]);        inq[qw.bian[i].end]=true;        num[qw.bian[i].end]++;        if(num[qw.bian[i].end]>=c) return false;    }          }  }   for(int i=0;i<c;i++)   cout<<d[i]<<",";   cout<<endl;  }  return true; } int main(){ int c1,c2,ednum; cin>>city>>ednum>>c1>>c2; int pop; for(int i=0;i<city;i++) {  node temp;  temp.id=i;  cin>>pop;  temp.pop = pop;  ad.push_back(temp); } for (int i = 0; i <ednum; i++) {  int start, end, weight;  cin >> start >> end >> weight;  edge qw;  qw.end = end; qw.weight = weight;  ad[start].bian.push_back(qw);  qw.end=start;  ad[end].bian.push_back(qw); }  SPFA(c1,city); cout<<d[c2];  return 0; }
转载请注明原文地址: https://www.6miu.com/read-52958.html

最新回复(0)