您的位置:首页 > 其它

用SPFA求解最短路径问题

2017-07-11 09:26 477 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: