bzoj 1975 [Sdoi2010]魔法猪学院
1975: [Sdoi2010]魔法猪学院
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1758 Solved: 557
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 1.5
2 1 1.5
1 3 3
2 3 1.5
3 4 1.5
1 4 1.5
Sample Output
HINT
样例解释
有意义的转换方式共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
————————————我是分割线——————————————
题目大意:给出一张无向图,给出一个数值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=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';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,);
d[n]=;inq[n]=;
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]=;
}
}
}
inq[u]=;
}
}
int ans,size;
NODE q[];
inline int push(NODE x)
{
int now,next;
q[++size]=x;
now=size;
while(now>){
next=now>>;
if(q[next]<q[now]) break;
swap(q[now],q[next]);
now=next;
}
}
inline NODE pop()
{
int now,next;
NODE cur;
cur=q[];
q[]=q[size--];
now=;
while((now<<)<=size){
next=now<<;
if(next<size&&q[next+]<q[next]) next++;
if(q[now]<q[next]) break;
swap(q[now],q[next]);
now=next;
}
return cur;
}
inline void astar()
{
push((NODE){d[],,});
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<) 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,,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 ;
}
bzoj 1975 [Sdoi2010]魔法猪学院的更多相关文章
- Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1357 Solved: 446[Submit][Statu ...
- bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]
1975: [Sdoi2010]魔法猪学院 裸题... 被double坑死了 #include <iostream> #include <cstdio> #include &l ...
- 洛谷 P2483 BZOJ 1975 [SDOI2010]魔法猪学院
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- bzoj 1975 [Sdoi2010]魔法猪学院(k短路)
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- BZOJ 1975: [Sdoi2010]魔法猪学院——K短路,A*
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1975 题意&简要做法 一张有向图,求出最多的互不相同的路径,满足路径长度之和\(\l ...
- BZOJ 1975: [Sdoi2010]魔法猪学院 大水题 第k短路 spfa
https://www.lydsy.com/JudgeOnline/problem.php?id=1975 我好像到现在了第k短路都不会写,mdzz. 先spfa求出最短路,然后扫点存各种前置路径已经 ...
- BZOJ 1975 SDOI2010 魔法猪学院 A*k短路
题目大意:给定一个值E 求起点到终点的最多条路径 使长度之和不超过E k短路的A*算法--每一个点有一个估价函数=g[x]+h[x] 当中g[x]是从源点出发已经走了的长度 h[x]是从这个点到汇点的 ...
- 【BZOJ】1975: [Sdoi2010]魔法猪学院
题意 \(n(2 \le n \le 5000)\)个点,找尽量多的不同\(1\)到\(n\)的路径,每一次的花费就是路径的全值和,要求在费用不超过\(E\)的情况下路径最多. 分析 裸的最段路. 题 ...
- 【BZOJ】1975 [Sdoi2010]魔法猪学院(A*)
题目 传送门:QWQ 分析 k短路,Astar.估价函数是终点向外跑的最短路. 显然不是正解qwq. 代码 // By noble_ // Astar algorithm // #include &l ...
随机推荐
- java内存溢出分析工具
http://www.cnblogs.com/preftest/archive/2011/12/08/2281322.html java内存溢出分析工具:jmap使用实战 在一次解决系统tomcat老 ...
- Windows10怎么架设局域网DNS服务器?
已采纳 需要安装Windows组件进行设置.最好是安装服务器版本的Windows. 1. 安装DNS服务 开始—〉设置—〉控制面板—〉添加/删除程序—〉添加/删除Windows组件—〉“网络服务”—〉 ...
- C# 动态类型与动态编译简介
关于C#的动态类型与动态编译的简介,主要是一个Demo. 动态类型 关键字: dynamic 这里有详细的介绍:[C#基础知识系列]专题十七:深入理解动态类型 动态类型的应用场景 可以减少强制转换(强 ...
- iview-cli 项目、iView admin 跨域问题解决方案
在build 目录的 webpack.dev.config.js 目录中 module.exports = merge(webpackBaseConfig, { devtool: '#source-m ...
- 从米家到 HomeKit,你只需要一个树莓派
转载:从米家到 HomeKit,你只需要一个树莓派 2017.10.21 该教程针对 Raspbian Stretch (8 月起基于新版 Debian 的系统)更新,请注意文章中提示 Stretch ...
- 解决python2.x文件读写编码问题
转自: https://xrlin.github.io/%E8%A7%A3%E5%86%B3python2.x%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99%E7%BC%96 ...
- softmax为什么使用指数函数?(最大熵模型的理解)
解释1: 他的假设服从指数分布族 解释2: 最大熵模型,即softmax分类是最大熵模型的结果. 关于最大熵模型,网上很多介绍: 在已知部分知识的前提下,关于未知分布最合理的推断就是符合已知知识最不确 ...
- 概率论与数理统计基础<1>:随机事件与随机变量
Part1. 随机事件 1-1.随机试验 随机试验:可以在相同条件下重复进行,每次试验的结果不止一个,事先知道所有可能的结果但不确定是哪一个的试验. 举例:重复的抛出一枚均匀的硬币就是一个随机试验,事 ...
- Codeforces Round #493 (Div 2) (A~E)
目录 Codeforces 998 A.Balloons B.Cutting C.Convert to Ones D.Roman Digits E.Sky Full of Stars(容斥 计数) C ...
- 函数栈溢出引起的段错误segmentation fault
遇到了一个奇怪的问题: 有一个回调函数中发生了段错误,但经检查也没有什么明显的错误,然后用排除法一点一点屏蔽,最后定位在一个函数里出错,但这个函数没什么明显错误.最后把入口参数改为引用传递就不报错误. ...