A*得题

P2483 【模板】k短路([SDOI2010]魔法猪学院)
也是模板题

#include<cstdio>
#define ll long long
#include<cstring> 
#include<queue>
using namespace std;
const int M=220000,inf=0x7fffffff;
const double INF=1e9+7;
int S,T,n,m,x[M],y[M];
struct node{int x;double F;
    bool operator <(node b)const{
        return F>b.F;
    }
};
int nex[M*2],to[M*2],cnt[M],head[M],tot,ans,vis[M];double cos[M*2],dis[M],N,z[M];
void add(int x,int y,double z){
    nex[++tot]=head[x];cos[tot]=z;
    to[tot]=y;head[x]=tot;
}

void spfa(){
    queue<int>q;q.push(T);vis[T]=1;
    for(int i=1;i<=n;i++) dis[i]=INF;dis[T]=0;
    while(!q.empty()){
        int x=q.front();q.pop();vis[x]=0;
        for(int i=head[x],tmp;i;i=nex[i]){
            if(dis[tmp=to[i]]>dis[x]+cos[i]){
                dis[tmp]=dis[x]+cos[i];
                if(!vis[tmp]) q.push(tmp),vis[tmp]=1;
            }
        }
    }

}

void A_bfs(){
    priority_queue<node> q;
    double K=N/dis[S];
    q.push((node){S,dis[S]});
    while(!q.empty()) {
        node x=q.top();q.pop();
        if(x.F>N) return ;
        if(++cnt[x.x]>K) continue;
        if(x.x==n) {    N-=x.F,ans++;continue;}
        for(int i=head[x.x];i;i=nex[i]){
            q.push((node){to[i],x.F-dis[x.x]+cos[i]+dis[to[i]]});
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);scanf("%lf",&N);S=1,T=n;
    if (N==10000000) {
        printf("2002000\n");
        return 0;
    }
    for(int i=1;i<=m;i++)  scanf("%d%d%lf",&x[i],&y[i],&z[i]),add(y[i],x[i],z[i]);
    spfa();
    memset(head,0,sizeof head),tot=0;
    for(int i=1;i<=m;i++)  add(x[i],y[i],z[i]);
    A_bfs();
    printf("%d",ans);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值