Noip模拟 Day6.13 By LD T1
一、哲哲回家
出题人的解答:
可以将其转化成最短路模型。
这个地方转车怎么转移有点困难,有两种方法:
1.我们可以再把每一个点拆成M个点,我们用F[i,j]表示从1号点到i这个点并且坐在j路车上的最少费用,对于同一条线路的相邻两个点,我们连一条权值为Rj的边,对于不在同一条 线路的两个点,连一条Rj+Tk的边,最后的答案就是min{f[n,i]}(1≤i≤m);
2.我们定义f[i]为在点i处下车的最少费用,那么对于同一条路线上的点两两连边,费用为:经过的边数*Rj+Tk;可以发现Pi较小,使用后一种连边方式较优,点数是N,边数是M*P2。具体使用SPFA实现。
连边比较麻烦,我写Dijkstra+Heap
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std; typedef long long LL; #define INF 1<<30
#define N 100010 struct edge
{
int v,w,next;
}e[N];
int head[N];
int cnt; struct data
{
int to,len;
}p; struct cmp
{
bool operator()(const data a,const data b)
{
return a.len>b.len;
}
}; int n,m,dian;
int t,r,pp;
int turn; int vis[N],dist[N]; void link(int u,int v,int w)
{
e[++cnt]=(edge){v,w,head[u]};
head[u]=cnt;
} void Dij(int s)
{
priority_queue<data,vector<data>,cmp>q;
for (int i=1;i<=dian;i++)
dist[i]=INF;
dist[s]=0;
vis[s]=1;
for (int i=head[s];i;i=e[i].next)
if (dist[e[i].v]>dist[s]+e[i].w)
{
dist[e[i].v]=dist[s]+e[i].w;
p.to=e[i].v;
p.len=dist[p.to];
q.push(p);
}
for (int i=1;i<=dian-1;i++)
{
if (q.empty())
break;
p=q.top();
q.pop();
while (vis[p.to] && !q.empty())
p=q.top(),q.pop();
int x=p.to;
// int len=p.len;
vis[x]=1;
for (int j=head[x];j;j=e[j].next)
if (dist[e[j].v]>dist[x]+e[j].w)
{
dist[e[j].v]=dist[x]+e[j].w;
p.to=e[j].v;
p.len=dist[p.to];
q.push(p);
}
}
} int main()
{
freopen("home.in","r",stdin);freopen("home.out","w",stdout);
scanf("%d%d",&n,&m);
dian=n+1;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&t,&r,&pp);
for (int j=1;j<pp;j++)
{
scanf("%d",&turn);
link(turn,dian,t);
link(dian,turn,0);
link(dian,dian+1,r);
dian++;
}
link(dian,dian+1-pp,r);
scanf("%d",&turn);
link(turn,dian,t);
link(dian,turn,0);
dian++;
}
Dij(1);
printf("%d\n",dist[n]);
return 0;
}
机房另外一个神犇写了spfa
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#ifdef WIN32
#define OT "%I64d"
#else
#define OT "%lld"
#endif
using namespace std;
typedef long long LL;
const int MAXN = 520;
const int inf = (1<<30);
int n,m;
int dis[MAXN][MAXN];
int next[MAXN][MAXN];
int T[MAXN],R[MAXN],p[MAXN][MAXN];
bool pd[MAXN][MAXN]; struct node{
int x,y;
}; queue<node>Q;
int ans; inline int getint()
{
int w=0,q=0;
char c=getchar();
while((c<'0' || c>'9') && c!='-') c=getchar();
if (c=='-') q=1, c=getchar();
while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();
return q ? -w : w;
} inline void spfa(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=inf; while(!Q.empty()) Q.pop(); node lin;
for(int i=1;i<=n;i++)
if(next[i][1]!=0){
lin.x=i; lin.y=1;
Q.push(lin);
dis[i][1]=T[i];
pd[i][1]=1;
} while(!Q.empty()) {
int x=Q.front().x; int y=Q.front().y; Q.pop();
pd[x][y]=0;
for(int i=1;i<=n;i++) {
if(i!=x) {
if(next[i][y]==0) continue;
if(dis[i][y]>dis[x][y]+T[i]) {
dis[i][y]=dis[x][y]+T[i];
if(!pd[i][y]) {
pd[i][y]=1;
lin.x=i; lin.y=y;
Q.push(lin);
}
}
} else{
if(dis[x][next[x][y]]>dis[x][y]+R[i]) {
dis[x][next[x][y]]=dis[x][y]+R[i];
if(!pd[x][next[x][y]]) {
pd[x][next[x][y]]=1;
lin.x=x; lin.y=next[x][y];
Q.push(lin);
}
}
}
}
} ans=inf;
for(int i=1;i<=n;i++) {
if(dis[i][n]<ans) ans=dis[i][n];
}
} inline void solve(){
n=getint(); m=getint();
for(int i=1;i<=m;i++) {
T[i]=getint(); R[i]=getint(); p[i][0]=getint();
for(int j=1;j<=p[i][0];j++) {
p[i][j]=getint(); if(j!=1) next[i][p[i][j-1]]=p[i][j];
}
if(p[i][0]>0) next[i][p[i][p[i][0]]]=p[i][1];
} spfa(); printf("%d",ans);
} int main()
{
freopen("home.in","r",stdin);
freopen("home.out","w",stdout);
solve();
fclose(stdin);
fclose(stdout);
return 0;
}
Noip模拟 Day6.13 By LD T1的更多相关文章
- NOIP模拟测试13
考得还算可以,T3还有提升空间(没看清题&&样例没过 拿了4分). 期望得分:80+40+0=120 实际得分:80+85+4=169 一脸黑线.....是数据比较水的原因,T2分都比 ...
- 8.5 NOIP 模拟测试 13
今天的考试说实话T1很简单没A,我是傻X.T2T3难得一批,但是暴力的分还是拿了! 总结一下就是:骗分过样例,暴力出奇迹!只要瞎搞就行了! 话说现在终于不像之前那么傻了,终于知道打暴力了,因为之前暴力 ...
- 2019.8.5 NOIP模拟测试13 反思总结【已更新完毕】
还没改完题,先留个坑. 放一下AC了的代码,其他东西之后说… 改完了 快下课了先扔代码 跑了跑了 思路慢慢写 来补完了[x 刚刚才发现自己打错了标题 这次考试挺爆炸的XD除了T3老老实实打暴力拿了52 ...
- NOIP模拟赛13
期望得分:100+0+100=200 实际得分:100+5+100=205 T1 空间卡到30M.. n<=2.5*1e7 若x是整除区间[1,n]每个数的最小的数,那么对[1,n]每个数分解质 ...
- 8.5 NOIP模拟测试13 矩阵游戏+跳房子+优美序列
T1矩阵游戏 数学题.首先这一列这一行先乘还是后乘对最后答案没有影响.a[i][j]表示矩阵中原始的值,h[i]表示i行的累乘,l[i]表示i列的累乘.易得ans=Σa[i][j]*h[i]*l[i] ...
- NOIP模拟测试13「矩阵游戏·跳房子·优美序列」
矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...
- Noip模拟 Day6.12
第一题:贪吃蛇(snake) 本题其实就是判断一个有向图中有没有环,做一次拓扑排序就可以了,如果所有点都入队了,就表示没有环,否则就有环.或者就是dfs一次,每个点只需要被访问一次,这样也是O(n)的 ...
- 「题解」NOIP模拟测试题解乱写I(29-31)
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
- 5.22考试总结(NOIP模拟1)
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...
随机推荐
- 借助百度地图API制作企业百度地图
做网站需要插入地图,可以借助百度地图API,具体步骤如下: 1.打开百度地图API的网址: http://api.map.baidu.com/lbsapi/creatmap/ 2.设置中心点 3. ...
- glibc库函数,系统调用API
glibc封装了大部分系统API,我们一般都是使用glibc封装的接口进行系统调用,碰到一些没有封装的接口,可以通过这个 函数syscall 进行系统调用. /* Invoke `system c ...
- windows系统查看目录树
进入到需要查看的目录后,按住shift键,然后单击鼠标右键,选择“在此处打开命令窗口”,然后命令行窗口界面. 1.若是只查看该目录下有哪些目录,输入tree即可 2.若是显示该目录及其子目录下的所有目 ...
- Linux命令学习(4):gzip压缩与解压
版权声明:本文为博主原创文章,未经允许不得转载 引子 gzip是Linux系统中最常用也是高效的压缩压缩命令.早期Linux系统中主要使用compress命令压缩,得到后缀为“.Z”的压缩文件,但是后 ...
- Java线上应用故障排查
线上故障主要2种: CPU利用率很高, 内存占用率很大 一.CPU利用率很高 1. top查询那个进程CPU使用率高 2. 显示进程列表 ps -mp pid -o THREAD,tid,time 找 ...
- *lucene索引_创建_域选项
[索引建立步骤] [创建Directory] [创建writer] [创建文档并添加索引] 文档和域的概念很重要 文档相当于表中的每一条记录,域相当于表中的每一个字段. [查询索引的基本信息] 使用I ...
- Qt笔记——连接第三方库&用libZPlay库获取音频文件的艺术家、专辑等信息
连接第三方库libZPlay 概述 需要.a/.lib ,.h , .dll 三个文件 官网下载 http://libzplay.sourceforge.net/ import .h 链接 .a 放入 ...
- 【转】Selenium专题—JQuery选择器
juqery选择器是jquery库中非常重要的功能.jquery选择器是基于CSS1-3选择器,加上一些额外的选择器.这些选择器和CSS选择器的使用方法很相似,允许开发人员简单快速的识别页面上的元素. ...
- 【转】Java的path,classpath,java_home环境变量的配置与具体含义
对于一个Java初学者来说,第一步要做的是安装jdk并配置环境变量,一般按照书上或者网上的步骤,一步步照着做就行了,但是对于初学者来说,很多问题没有解决,比如为什么很多配置方法各不相同,却都能够配置成 ...
- [K/3Cloud] 隐藏菜单后,如何在插件间接的调用隐藏菜单的操作
使用场景: 动态表单里面挂了个单据的序时薄,序时薄有菜单,但是把序时薄的工具栏隐藏了.新增,修改全部动态表单自己写.删除和过滤我想间接调用下隐藏的序时薄的删除和过滤按钮的操作.在插件里如何实现? 答: ...