用SPFA求解最短路径问题

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值