spfa算法

来源:互联网 发布:linux exec用法 编辑:程序博客网 时间:2024/05/21 18:54
#include <iostream>  #include <cstring>  #include <queue>  using namespace std;  const int inf = 0x3fffffff;     int d[10005];  int vis[10005];  int num[10005];struct cmp  {       bool operator()(int x,int y)       {            return x>y;       }  };  struct node{int v,w;};vector<node>a[10005];int n,m;bool spfa(int s0)  {       priority_queue<int,vector<int>,cmp> q;       memset(vis,0,sizeof(vis));       memset(num,0,sizeof(num));       fill(d,d+10005,inf);     d[s0] = 0;       q.push(s0);       vis[s0] = true;       num[s0]++;       while(!q.empty())       {            int p = q.top();            q.pop();            for(int i=0;i<a[p].size();i++)            {                 int v=a[p][i].v;               if(d[p]+a[p][i].w<d[v])                 {                      d[v] = d[p]+a[p][i].w;                      if(!vis[v])                      {                           q.push(v);                           num[v]++;                           if(num[v]>=n)//存在负环                           {                                return false;                           }                           vis[v]=true;                      }                 }            }           vis[p]=0;     }       return true;  }  int main(){     int k,i,u,v,w;       //freopen("in.txt","r",stdin);  while(~scanf("%d%d",&n,&m))  {  for(i=0;i<=1005;i++)  {  a[i].clear();}  if(n==0)  break;for(i=0;i<m;i++){node t;scanf("%d%d%d",&u,&v,&w);t.v=v;t.w=w;a[u].push_back(t);t.v=u;a[v].push_back(t);}bool c=spfa(1);printf("%d\n",d[n]);}}

原创粉丝点击