Codeforces 101490E Charles in Charge

来源:互联网 发布:单片机呼吸灯 编辑:程序博客网 时间:2024/04/28 09:53

题目链接戳这里。


题目大意:某电动车的价格与电池大小成正比,因为电动车只能在城市里充电,所以会造成绕路的情况导致回家变慢。此人要求自己回家的时间要在原来不换电动车(可以跑最短路)的情况下最多增加X%,求电池的最小容量即走的路径上的最长边权。


思路:二分+dij不解释。。难得一见的水题,尽管dij还是wa了一次。

#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<iostream>#include<cmath>#include<cstdlib>#include<queue>#define INF 1e9#define pa pair<long long,int>using namespace std;const int MAXN=10010;const int MAXM=100010;struct edge{int next,to,val;};edge e[MAXM];int head[MAXN],cnt;void addedge(int u,int v,int w){e[++cnt].next=head[u];e[cnt].to=v;e[cnt].val=w;head[u]=cnt;}priority_queue <pa,vector<pa>,greater<pa> > q;long long dis[MAXN];bool visit[MAXN];long long a,b;int n;bool check(int mid){for (int i=1;i<=n;i++){dis[i]=INF;}memset(visit,false,sizeof(visit));dis[1]=0;q.push(make_pair(0,1));while (!q.empty()){int x=q.top().second;q.pop();if (visit[x]){continue;}visit[x]=1;for (int i=head[x];i;i=e[i].next){int v=e[i].to;if (e[i].val>mid){continue;}if (dis[v]>dis[x]+e[i].val){dis[v]=dis[x]+e[i].val;q.push(make_pair(dis[v],v));}}}if (dis[n]*100<=a*(100+b)){return 1;}else{return 0;}}int main(){int m;scanf("%d%d%d",&n,&m,&b);for (int i=1;i<=m;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);addedge(u,v,w);addedge(v,u,w);}check(1e9);a=dis[n];int l=0,r=1e9,mid,ans;while (l<=r){mid=(l+r)>>1;if (check(mid)){ans=mid;r=mid-1;}else{l=mid+1;}}cout<<ans;    return 0;}


原创粉丝点击