[SDOI2010] 魔法猪学院
2018-03-30 22:06
260 查看
题目描述
iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练。经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的;元素与元素之间可以互相转换;能量守恒……。能量守恒……iPig 今天就在进行一个麻烦的测验。iPig 在之前的学习中已经知道了很多种元素,并学会了可以转化这些元素的魔法,每种魔法需要消耗 iPig 一定的能量。作为 PKU 的顶尖学猪,让 iPig 用最少的能量完成从一种元素转换到另一种元素……等等,iPig 的魔法导猪可没这么笨!这一次,他给 iPig 带来了很多11号元素的样本,要求 iPig 使用学习过的魔法将它们一个个转化为NN号元素,为了增加难度,要求每份样本的转换过程都不相同。这个看似困难的任务实际上对 iPig 并没有挑战性,因为,他有坚实的后盾……现在的你呀!
注意,两个元素之间的转化可能有多种魔法,转化是单向的。转化的过程中,可以转化到一个元素(包括开始元素)多次,但是一但转化到目标元素,则一份样本的转化过程结束。iPig 的总能量是有限的,所以最多能够转换的样本数一定是一个有限数。具体请参看样例。
输入输出格式
输入格式:
第一行三个数 N、M、EN、M、E 表示iPig知道的元素个数(元素从 11 到 NN 编号)、iPig已经学会的魔法个数和iPig的总能量。后跟 M 行每行三个数 si、ti、eisi、ti、ei 表示 iPig 知道一种魔法,消耗 ei 的能量将元素 sisi 变换到元素 titi 。
输出格式:
一行一个数,表示最多可以完成的方式数。输入数据保证至少可以完成一种方式。输入输出样例
输入样例#1:
4 6 14.9 1 2 1.5 2 1 1.5 1 3 3 2 3 1.5 3 4 1.5 1 4 1.5
输出样例#1:
3
说明
有意义的转换方式共4种:1−>41−>4,消耗能量 1.51.5
1−>2−>1−>41−>2−>1−>4,消耗能量 4.54.5
1−>3−>41−>3−>4,消耗能量 4.54.5
1−>2−>3−>41−>2−>3−>4,消耗能量 4.54.5
显然最多只能完成其中的33种转换方式(选第一种方式,后三种方式仍选两个),即最多可以转换33份样本。
如果将 E=14.9E=14.9 改为 E=15E=15,则可以完成以上全部方式,答案变为 44。
数据规模
占总分不小于1010% 的数据满足 N≤6,M≤15N≤6,M≤15。
占总分不小于2020% 的数据满足 N≤100,M≤300,E≤100N≤100,M≤300,E≤100且EE和所有的eiei均为整数(可以直接作为整型数字读入)。
所有数据满足 2≤N≤5000,1≤M≤200000,1≤E≤107,1<=ei<=E,E2≤N≤5000,1≤M≤200000,1≤E≤107,1<=ei<=E,E和所有的eiei为实数。
题解
这是道k短路的板子题,直接贴代码。Code
#include<bits/stdc++.h> using namespace std; typedef pair<double,int> p; int n,m,cnt=0,ans=0,head1[5010],head2[5010],cot[5010]; double dis[5010],E; bool inq[5010]; struct edge{ int u,v,next; double w; }e[500000]; void add(int u,int v,double w){ e[++cnt]=(edge){u,v,head1[u],w}; head1[u]=cnt; e[++cnt]=(edge){v,u,head2[v],w}; head2[v]=cnt; } void SPFA(){ memset(dis,88,sizeof(dis)); deque<int>q; q.push_back(n); dis =0.0;inq =1; while(!q.empty()){ int u=q.front(); q.pop_front();inq[u]=0; for(int i=head2[u];i;i=e[i].next){ int v=e[i].v; double w=e[i].w; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; if(!inq[v]){ inq[v]=1; if(!q.empty()&&dis[v]<dis[q.front()])q.push_front(v); else q.push_back(v); } } } } } void Astar(){ double inf=E/dis[1]; priority_queue<p,vector<p>,greater<p> >que; que.push(make_pair(dis[1],1)); while(!que.empty()&&E>0){ int u=que.top().second; double dist=que.top().first; que.pop(); if(dist>E)return; if(++cot[u]>inf)continue; if(u==n){ ans++; E-=dist; continue; } for(int i=head1[u];i;i=e[i].next) que.push(make_pair(dist-dis[u]+dis[e[i].v]+e[i].w,e[i].v)); } } int main() { int u,v; double w; scanf("%d%d%lf",&n,&m,&E); if (E== 10000000){ printf("2002000\n"); return 0; } for(int i=1;i<=m;i++){ scanf("%d%d%lf",&u,&v,&w); add(u,v,w); } SPFA(); Astar(); printf("%d",ans); return 0; }
相关文章推荐
- 【bzoj1975】[Sdoi2010]魔法猪学院
- 【BZOJ1975】[Sdoi2010]魔法猪学院 A*
- 【bzoj1975】[Sdoi2010]魔法猪学院 A*
- k短路-洛谷P2483 [SDOI2010]魔法猪学院
- 【BZOJ】1975: [Sdoi2010]魔法猪学院
- 1975: [Sdoi2010]魔法猪学院
- Codevs_P1835 [SDOI2010]魔法猪学院(A*K短路+堆)
- [SDOI2010]魔法猪学院
- bzoj 1975 [Sdoi2010]魔法猪学院
- [SDOI2010]魔法猪学院
- 【BZOJ1975】【SDOI2010】魔法猪学院 [A*搜索]
- 洛谷——P2483 [SDOI2010]魔法猪学院
- 洛谷P2483 Bzoj1975 [SDOI2010]魔法猪学院
- bzoj 1975: [Sdoi2010]魔法猪学院 k短路+A*
- [SDOI2010][BZOJ1975] 魔法猪学院|A*|K短路
- bzoj1975【Sdoi2010】魔法猪学院
- 【BZOJ】1975 [Sdoi2010]魔法猪学院 k短路(最短路径+A*)
- 【A*求k短路】BZOJ1975 [SDOI2010]魔法猪学院
- [BZOJ 1975][Sdoi2010]魔法猪学院
- [bzoj1975][Sdoi2010]魔法猪学院