Live2d Test Env

Hihocoder1081 最短路径 结构体练习

最短路径 :虽然做过很多次最短路的题,spfa,bellman,floyd都用过不少。但是题目强调的“顺序”又让我加深了对最短路的理解。

当然,主要还是练习下STL:

pair型:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<memory>
#include<queue>
using namespace std;
const int maxn=1010;
const int maxm=20010;
const int inf=1e9;
int dis[maxn],n,m,s,t;
int Laxt[maxm],Next[maxm],To[maxm],Len[maxm],cnt,in[maxn];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int > > >q;
void add(int u,int v,int d)
{
    Next[++cnt]=Laxt[u];
    Laxt[u]=cnt;
    To[cnt]=v;
    Len[cnt]=d;
}
void spfa()
{
    while(!q.empty()){
         int u=q.top().second;q.pop();
         in[u]=0;
         for(int i=Laxt[u];i;i=Next[i]){
              int v=To[i];
              if(dis[v]>dis[u]+Len[i]){
                    dis[v]=dis[u]+Len[i];
                    if(!in[v]) {
                       in[v]=1;
                       q.push(make_pair(dis[v],v));
                    }
              }
         }
    }
}
int main()
{
    int i,j,k,u,v,d;
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(i=1;i<=m;i++){
         scanf("%d%d%d",&u,&v,&d);
         add(u,v,d);
         add(v,u,d);
    }
    for(i=1;i<=n;i++) dis[i]=inf;
    dis[s]=0; in[s]=1;
    q.push(make_pair(0,s));
    spfa();
    printf("%d\n",dis[t]);
    return 0;
}

struct型

 

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<memory>
#include<queue>
using namespace std;
const int maxn=1010;
const int maxm=20010;
const int inf=1e9;
int dis[maxn],n,m,s,t;
int Laxt[maxm],Next[maxm],To[maxm],Len[maxm],cnt,in[maxn];
struct pii
{
     int dist;
     int node;
     pii(int a,int b):dist(a),node(b){}//赋值 
     bool friend operator <(pii a,pii b){//重载 
        return a.dist>b.dist;    
     } 
};
priority_queue<pii>q;
void add(int u,int v,int d)
{
    Next[++cnt]=Laxt[u];
    Laxt[u]=cnt;
    To[cnt]=v;
    Len[cnt]=d;
}
void spfa()
{
    while(!q.empty()){
         int u=q.top().node;q.pop();
         in[u]=0;
         for(int i=Laxt[u];i;i=Next[i]){
              int v=To[i];
              if(dis[v]>dis[u]+Len[i]){
                    dis[v]=dis[u]+Len[i];
                    if(!in[v]) {
                       in[v]=1;
                       pii tmp(dis[v],v);
                       q.push(tmp);
                    }
              }
         }
    }
}
int main()
{
    int i,j,k,u,v,d;
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(i=1;i<=m;i++){
         scanf("%d%d%d",&u,&v,&d);
         add(u,v,d);
         add(v,u,d);
    }
    for(i=1;i<=n;i++) dis[i]=inf;
    dis[s]=0; in[s]=1;
    pii tmp(0,s);
    q.push(tmp);
    spfa();
    printf("%d\n",dis[t]);
    return 0;
}

 

posted @ 2017-11-04 18:55  nimphy  阅读(172)  评论(0编辑  收藏  举报