BZOJ 1975 魔法猪学院(K短路)

阅读: 评论:0

BZOJ 1975 魔法猪学院(K短路)

BZOJ 1975 魔法猪学院(K短路)

题目链接:61.187.179.132/JudgeOnline/problem.php?id=1975

题意:给出一个带权有向图。求一个最大的K使得前K短路的长度之和不大于给定的值Sum。

思路:首先,求出每个点到n的最短路。接着,使用优先队列,节点为(D,u)。首先将(dis[1],1)进队。由于D在任意时候为一条1到n的路径的长度,那么对于边<u,v,w>,D-dis[u]+w+dis[v]为一条新的路径的长度。

 

vector<pair<int,double> > g[N],g1[N];
double dis[N];
int n,m;
double Sum;struct node
{int v;double dis;node(){}node(int _v,double _dis){v=_v;dis=_dis;}int operator<(const node &a) const{return dis>a.dis;}
};int inq[N];void SPFA()
{int i;FOR1(i,n) dis[i]=dinf;dis[n]=0; inq[n]=1;queue<int> Q;Q.push(n);int u,v;double w;while(!Q.empty()){u=Q.front();Q.pop();inq[u]=0;FOR0(i,SZ(g1[u])){v=g1[u][i].first;w=g1[u][i].second;if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;if(!inq[v]) inq[v]=1,Q.push(v);}}}
}priority_queue<node> Q;int cal()
{Q.push(node(1,dis[1]));int ans=0,i,v;node p;double w;while(!Q.empty()){p&#p();Q.pop();if(p.dis>Sum+EPS) break;if(p.v==n) {ans++;Sum-=p.dis;continue;}FOR0(i,SZ(g[p.v])){v=g[p.v][i].first;w=g[p.v][i].second;Q.push(node(v,p.dis-dis[p.v]+w+dis[v]));}}return ans;
}int main()
{RD(n,m); RD(Sum);int i,u,v;double w;FOR1(i,m){RD(u,v);RD(w);g[u].pb(MP(v,w));g1[v].pb(MP(u,w));}SPFA();PR(cal());
}

 

 

 

本文发布于:2024-02-05 02:38:40,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170722080762255.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:学院   魔法   BZOJ
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23