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 ...
随机推荐
- java.lang.IllegalArgumentException: Result Maps collection already contains value for com.zhmy.businessapi.mapper.CompanyMapper.BaseResultMap
复制mybatis的mapper.xml文件修改后,忘记将xml中的mapper标签里的namespace更换成对应类了,修改完即可
- linux 小键盘 数字键盘 wiki
https://wiki.archlinux.org/index.php/Activating_Numlock_on_Bootup_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96 ...
- C++ 指针形参和指针引用形参的原理分析
C++ 函数的参数传递可以分为:值传递和引用传递. 两者的最大区别也很简单,如果该函数的参数只是读的话,值传递就可以满足.如果该函数的参数需要进行修改并返回的时候,就应该进行引用传递. C++指针作为 ...
- HDU - 4514 湫湫系列故事——设计风景线(并查集判环)
题目: 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n ...
- sh与bash执行语法严谨问题
在Linux中,我们知道有几种方式可以运行.sh脚本 通过sh或者bash命令来运行 通过source来运行 通过./xxx.sh来运行(这种方式要求对脚本文件有r和x权限才行) 今天在写脚本的过程中 ...
- scrapy爬取简书整站文章
在这里我们使用CrawlSpider爬虫模板, 通过其过滤规则进行抓取, 并将抓取后的结果存入mysql中,下面直接上代码: jianshu_spider.py # -*- coding: utf-8 ...
- LeetCode(64) Minimum Path Sum
题目 Total Accepted: 47928 Total Submissions: 148011 Difficulty: Medium Given a m x n grid filled with ...
- Fiddler简介与Web抓包,远程抓包(IE、360、谷歌、火狐)
Fiddler简介以及web抓包 一.Fiddler简介 简单来说,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯.网上简介很多,我们不多说. 二 ...
- input输入框的readonly属性-----http://www.w3school.com.cn/tags/tag_input.asp
http://www.w3school.com.cn/tags/tag_input.asp input输入框的readonly属性 查询方法: 1.先找官方的文档,api 2.官方的有看不懂的再百度相 ...
- python gdal库安装
yum安装了postgis之后,会安装依赖gdal centos7.5的repo中gdal为1.11.4-3版本