HDU2544-最短路(dij堆优化与spfa)

赤裸裸的模板题。。
如果没有负边就用dij的堆优化
否则的话就用spfa

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
/* dijkstra
*/
const int maxn=1000*2;
struct Node
{   int v;
   int w;
   Node(){};
   Node(int  _a,int _b){v=_a;w=_b;}
};
int d[maxn];
int m,n;
vector<Node>G[maxn];
struct cmp
{bool operator()(pair<int,int> a,pair<int,int> b  )
{ return a.first>b.first;//从大到小排序,但是小的权值大,所以先弹小的

 //一句话,这和普通的排序是相反的。

}
};
void add(int a,int b,int c)
{  G[a].push_back(Node(b,c));
   G[b].push_back(Node(a,c));

}
void init()
{   for(int i=1;i<=m;i++)
    d[i]=1e9;
    for(int i=0;i<maxn;i++)
         G[i].clear();
}
int dijkstra()
{  priority_queue<pair<int,int> ,vector<pair<int,int> >,cmp>q;
   d[1]=0;
   q.push(make_pair(0,1));
   while(!q.empty())
   {  int  u=q.top().second;
       q.pop();
     for(int i=0;i<G[u].size();i++)
     {  int s=G[u][i].v;
         if(d[s]>d[u]+G[u][i].w)
         { d[s]=d[u]+G[u][i].w;
            q.push(make_pair(d[s],s));
         }
     }
   }
}
int main()
{   int a,b,c;
    ios::sync_with_stdio(false);
    while(cin>>m>>n)
     {if(m==0&&n==0) break;
         init();
    for(int i=0;i<n;i++)
    {  cin>>a>>b>>c;
       add(a,b,c);
    }
     dijkstra();
     cout<<d[m]<<endl;}
    return 0;
}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
/* dijkstra
*/
const int maxn=1000*2;
struct Node
{   int v;
   int w;
   Node(){};
   Node(int  _a,int _b){v=_a;w=_b;}
};
int d[maxn];
int m,n;
vector<Node>G[maxn];
bool vis[maxn];
struct cmp
{bool operator()(pair<int,int> a,pair<int,int> b  )
{ return a.first>b.first;

}
};
void add(int a,int b,int c)
{  G[a].push_back(Node(b,c));
   G[b].push_back(Node(a,c));

}
void init()
{   for(int i=1;i<=m;i++)
    d[i]=1e9;
    for(int i=1;i<=m;i++)
        vis[i]=false;
    for(int i=0;i<maxn;i++)
         G[i].clear();
}
int spfa()
{  queue<int>q;
    q.push(1);
    d[1]=0;
    vis[1]=true;
    while(!q.empty())
    {   int u=q.front();
        q.pop();
         vis[u]=false;
      for(int i=0;i<G[u].size();i++)
      {   int s=G[u][i].v;
          if(d[s]>d[u]+G[u][i].w)
          {d[s]=d[u]+G[u][i].w;
            if(!vis[s])
            {vis[s]=true;
              q.push(s);
            }
          }
      }
       }


}
int main()
{   int a,b,c;
    ios::sync_with_stdio(false);
    while(cin>>m>>n)
     {if(m==0&&n==0) break;
         init();
    for(int i=0;i<n;i++)
    {  cin>>a>>b>>c;
       add(a,b,c);
    }
     spfa();
     cout<<d[m]<<endl;}
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值