bzoj 1975 [Sdoi2010]魔法猪学院
2016-09-27 17:22
267 查看
1975: [Sdoi2010]魔法猪学院
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1758 Solved: 557
[Submit][Status][Discuss]
Description
iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练。经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的;元素与元素之间可以互相转换;能量守恒……。 能量守恒……iPig 今天就在进行一个麻烦的测验。iPig 在之前的学习中已经知道了很多种元素,并学会了可以转化这些元素的魔法,每种魔法需要消耗 iPig 一定的能量。作为 PKU 的顶尖学猪,让 iPig 用最少的能量完成从一种元素转换到另一种元素……等等,iPig 的魔法导猪可没这么笨!这一次,他给 iPig 带来了很多 1 号元素的样本,要求 iPig 使用学习过的魔法将它们一个个转化为 N 号元素,为了增加难度,要求每份样本的转换过程都不相同。这个看似困难的任务实际上对 iPig 并没有挑战性,因为,他有坚实的后盾……现在的你呀! 注意,两个元素之间的转化可能有多种魔法,转化是单向的。转化的过程中,可以转化到一个元素(包括开始元素)多次,但是一但转化到目标元素,则一份样本的转化过程结束。iPig 的总能量是有限的,所以最多能够转换的样本数一定是一个有限数。具体请参看样例。Input
第一行三个数 N、M、E 表示iPig知道的元素个数(元素从 1 到 N 编号)、iPig已经学会的魔法个数和iPig的总能量。 后跟 M 行每行三个数 si、ti、ei 表示 iPig 知道一种魔法,消耗 ei 的能量将元素 si 变换到元素 ti 。Output
一行一个数,表示最多可以完成的方式数。输入数据保证至少可以完成一种方式。Sample Input
4 6 14.91 2 1.5
2 1 1.5
1 3 3
2 3 1.5
3 4 1.5
1 4 1.5
Sample Output
3HINT
样例解释有意义的转换方式共4种:
1->4,消耗能量 1.5
1->2->1->4,消耗能量 4.5
1->3->4,消耗能量 4.5
1->2->3->4,消耗能量 4.5
显然最多只能完成其中的3种转换方式(选第一种方式,后三种方式仍选两个),即最多可以转换3份样本。
如果将 E=14.9 改为 E=15,则可以完成以上全部方式,答案变为 4。
数据规模
占总分不小于 10% 的数据满足 N <= 6,M<=15。
占总分不小于 20% 的数据满足 N <= 100,M<=300,E<=100且E和所有的ei均为整数(可以直接作为整型数字读入)。
所有数据满足 2 <= N <= 5000,1 <= M <= 200000,1<=E<=107,1<=ei<=E,E和所有的ei为实数。
Source
Sdoi2010 Contest2 Day2[Submit][Status][Discuss]
HOME Back
————————————我是分割线——————————————
题目大意:给出一张无向图,给出一个数值m,求出从1到N的前k短路的长度和>=数值m。
思路:
思路很简单,就是按顺序求出这张图的前k短路,然后当m减成负数的时候就返回。
k短路的求解要用到A*算法
A*算法的启发式函数f(n)=g(n)+h(n)
g(n)是状态空间中搜索到n所花的实际代价
h(n)是n到结束状态最佳路径的估计代价
关于h(n)的选取,当h(n)<实际代价时,搜索慢但可出解;h(n)=实际代价时,正确率与效率最高;h(n)>实际代价,快但只能得到近似解。
但在k短路问题中,h(n)是可以选到准确值的,就是n到结束节点的最短路,预处理时从结束节点做一次单源最短路即可。
按广搜的方式扩展节点,每次优先扩展f(n)最小的节点。
第i次扩展到目标节点,代表找到了第i短路。
正确性什么的很好理解。
k短路关于A*部分代码很简洁,用优先队列维护。
注意!不能使用priority_queue,否则你会死的很惨。。
/* Problem: OJ: User: S.B.S. Time: Memory: Length: */ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> #include<iomanip> #include<cassert> #include<climits> #include<functional> #include<bitset> #include<vector> #include<list> #include<map> #define F(i,j,k) for(int i=j;i<=k;i++) #define M(a,b) memset(a,b,sizeof(a)) #define FF(i,j,k) for(int i=j;i>=k;i--) #define maxn 100001 #define inf 0x3f3f3f3f #define maxm 1001 #define mod 998244353 //#define LOCAL using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m; double d[maxn]; struct EDGE { int u; int v; double w; int next; }e1[maxn],e2[maxn]; int tot1,tot2; int head1[maxn],head2[maxn]; inline int addedge1(int u,int v,double w) { tot1++; // e1[tot1].u=u; e1[tot1].v=v; e1[tot1].w=w; e1[tot1].next=head1[u]; head1[u]=tot1; } inline int addedge2(int u,int v,double w) { tot2++; // e2[tot2].u=u; e2[tot2].v=v; e2[tot2].w=w; e2[tot2].next=head2[u]; head2[u]=tot2; } struct NODE { double f; double g; int o; bool operator < (const NODE & a) const{return f<a.f;} }; double c; bool inq[maxn]; inline int spfa() { queue<int> q; M(d,127); d =0;inq =1; q.push(n); while(!q.empty()) { int u=q.front();q.pop(); for(int i=head2[u];i;i=e2[i].next) { int v=e2[i].v; if(d[v]>d[u]+e2[i].w){ // cout<<d[u]<<" "<<e2[i].w<<" "<<d[u]+e2[i].w<<"*********"<<endl; d[v]=d[u]+e2[i].w; // cout<<d[v]<<" &&&&&&"<<endl; if(!inq[v]){ q.push(v); inq[v]=1; } } } inq[u]=0; } } int ans,size; NODE q[2000000]; inline int push(NODE x) { int now,next; q[++size]=x; now=size; while(now>1){ next=now>>1; if(q[next]<q[now]) break; swap(q[now],q[next]); now=next; } } inline NODE pop() { int now,next; NODE cur; cur=q[1]; q[1]=q[size--]; now=1; while((now<<1)<=size){ next=now<<1; if(next<size&&q[next+1]<q[next]) next++; if(q[now]<q[next]) break; swap(q[now],q[next]); now=next; } return cur; } inline void astar() { push((NODE){d[1],0,1}); while(size){ NODE x=pop(); for(int i=head1[x.o];i;i=e1[i].next){ int v=e1[i].v; push((NODE){x.g+e1[i].w+d[v],x.g+e1[i].w,v}); } if(x.o==n){ c-=x.f; if(c<0) return; ans++; } } } int main() { std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y; #ifdef LOCAL freopen("data.in","r",stdin); freopen("data.out","w",stdout); #endif cin>>n>>m>>c; int u,v; double w; F(i,1,m){ cin>>u>>v>>w; // cout<<u<<" "<<v<<" "<<w<<endl; addedge1(u,v,w); // cout<<e1[i].w<<" "; addedge2(v,u,w); // cout<<e2[i].w<<endl; } spfa(); // F(i,1,n) cout<<d[i]<<" ";cout<<endl; astar(); cout<<ans<<endl; return 0; }
View Code
相关文章推荐
- BZOJ 1975 [Sdoi2010]魔法猪学院
- bzoj 1975: [Sdoi2010]魔法猪学院 (k短路)
- BZOJ 1975: [Sdoi2010]魔法猪学院 K短路 dijkstra A*
- bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]
- [bzoj1975][Sdoi2010]魔法猪学院
- 【bzoj1975】【K短路】[Sdoi2010]魔法猪学院
- [A* k短路] BZOJ 1975 [Sdoi2010]魔法猪学院
- BZOJ 1975 SDOI2010 魔法猪学院 A*k短路
- [bzoj1975][Sdoi2010]魔法猪学院 k短路 dijkstra
- 【bzoj1975】[Sdoi2010]魔法猪学院
- BZOJ 1975 SDOI2010 魔法猪学院 A*k短路
- bzoj1975【Sdoi2010】魔法猪学院
- [BZOJ1975][SDOI2010]魔法猪学院(k短路,A*)
- 【BZOJ1975】【SDOI2010】魔法猪学院 [A*搜索]
- BZOJ 1975: [Sdoi2010]魔法猪学院
- 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院
- [BZOJ1975][Sdoi2010]魔法猪学院(k短路)
- [BZOJ1975][Sdoi2010]魔法猪学院
- BZOJ 1975 [Sdoi2010]魔法猪学院 - k短路(手写堆)
- bzoj1975: [Sdoi2010]魔法猪学院