51nod1459【二级最短路】

标签说的是BFS。。。
太菜,不知道怎么BFS。。。是不是spfa写,就叫BFS。。。感觉不是。。。。
只是二级最短路的写法,直接搞就很容易了,简单题;

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

const int INF=0x3f3f3f3f;
const int N=5e2+10;

int val[N];
struct asd{
    int w;
    int to;
    int next;
};
asd q[N*N];
int head[N*N],tol,dis[N],d[N];
int n,m,s,t;
bool vis[N];
queue<int>e;
void spfa()
{
    while(!e.empty())
        e.pop();
    for(int i=0;i<n;i++)
    {
        dis[i]=INF;
        d[i]=0;
        vis[i]=false;
    }
    d[s]=val[s];
    dis[s]=0;
    vis[s]=true;
    e.push(s);
    while(!e.empty())
    {
        int u=e.front();e.pop();
        vis[u]=0;
        for(int v=head[u];v!=-1;v=q[v].next)
        {
            int i=q[v].to;
            if(dis[i]>dis[u]+q[v].w)
            {
                dis[i]=dis[u]+q[v].w;
                d[i]=d[u]+val[i];
                if(!vis[i])
                {
                    vis[i]=1;
                    e.push(i);
                }
            }
            else if(dis[i]==(dis[u]+q[v].w))
            {
                if(d[i]<d[u]+val[i])
                    d[i]=d[u]+val[i];
            }
        }
    }
    printf("%d %d
",dis[t],d[t]);
}

void add(int a,int b,int c)
{
    q[tol].to=b;
    q[tol].w=c;
    q[tol].next=head[a];
    head[a]=tol++;
}

void init()
{
    memset(head,-1,sizeof(head));
    tol=0;
}

int main()
{
    scanf("%d",&n);
    scanf("%d",&m);
    scanf("%d%d",&s,&t);

    for(int i=0;i<n;i++)
        scanf("%d",&val[i]);

    init();
    while(m--)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
        add(b,a,c);
    }
    spfa();
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934753.html