[BZOJ 3669][Noi2014]魔法森林:SPFA

本文介绍了一种使用SPFA算法解决特定图论问题的方法。通过将边按特定关键字排序,并逐步加入图中,每加入一条边就运行一次SPFA算法来更新最短路径,最终找到最优解。代码示例展示了如何实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击这里查看原题

把所有边以a为第一关键字,b为第二关键字进行排序,依次加边,每加一条边做一次SPFA,看能否缩小答案。

/*
User:Small
Language:C++
Problem No.:3669
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=1e5+5;
int n,ans,tot,fir[M>>1],m,dis[M>>1];
bool vis[M>>1];
queue<int> q;
struct no{
    int u,v,a,b;
    bool operator<(const no y)const{
        return a==y.a?b<y.b:a<y.a;
    }
}ed[M];
struct edge{
    int v,b,nex;
}e[M<<1];
void add(int u,int v,int b){
    e[++tot]=(edge){v,b,fir[u]};
    fir[u]=tot;
}
int main(){
    freopen("data.in","r",stdin);//
    ios::sync_with_stdio(0);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d%d%d%d",&ed[i].u,&ed[i].v,&ed[i].a,&ed[i].b);
    sort(ed+1,ed+m+1);
    ans=inf;
    memset(dis,127,sizeof(dis));
    dis[1]=0;
    for(int i=1;i<=m;i++){
        add(ed[i].u,ed[i].v,ed[i].b);
        add(ed[i].v,ed[i].u,ed[i].b);
        if(!vis[ed[i].u]){
            vis[ed[i].u]=1;
            q.push(ed[i].u);
        }
        if(!vis[ed[i].v]){
            vis[ed[i].v]=1;
            q.push(ed[i].v);
        }
        if(ed[i].a==ed[i-1].a&&ed[i].b==ed[i-1].b) continue;
        while(!q.empty()){
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int j=fir[u];j;j=e[j].nex){
                int v=e[j].v;
                if(dis[v]>max(dis[u],e[j].b)){
                    dis[v]=max(dis[u],e[j].b);
                    if(!vis[v]){
                        vis[v]=1;
                        q.push(v);
                    }
                }
            }
        }
        ans=min(ans,dis[n]+ed[i].a);
    }
    if(ans==inf) ans=-1;
    printf("%d\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值