请注意本文章所描写的算法只可以获得前 14 个测试点(含三个样例)的部分分,但是没有出现 WA 的情况。

推荐阅读

题面

给出 \(m\) 个线段,每次可以从线段上任意一点以代价 \(c_i\) 走到线段上另一点,每条线段只能使用一次,求从 \(1\) 位置走到 \(n\) 位置的最小代价。

部分分题解

观察样例可以发现,在线段上走的目的其实是走到下一个线段/终点上,因此当前点转化成了当前线段的移动,一定程度上减小了时间复杂度,但是由于线段移动可行性的判断是 \(O(m^2)\) 的,而移动方案数也可以被卡到 \(O(m^2)\)(起点 \(s_i=s_{i-1}\),终点 \(t_i=t_{i-1}+1\)),因此这个算法效率也并不是太高,但是此处的转化思想还是挺有意义的。

代码

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<climits>
const int MAXN=1e5+5;
struct Edge{int u,v,next;long long w;};
struct Point
{
int v;long long w;
bool operator < (const Point &b) const
{
return w==b.w?v<b.v:w>b.w;
}
};
std::priority_queue<Point>que;
long long sample;int n,m,head[MAXN],cnt,u[MAXN],v[MAXN];bool vis[MAXN];long long dis[MAXN],w[MAXN];Edge edge[MAXN*3];
void AddEdge(int u,int v,long long w)
{
//printf("%d %d %lld\n",u,v,w);
edge[++cnt].u=u;edge[cnt].v=v;edge[cnt].w=w;
edge[cnt].next=head[u];head[u]=cnt;
}
void Dijkstra()
{
Point tmp,temp;
memset(dis,0x3f3f3f,sizeof(dis));
temp.v=0;temp.w=0;sample=dis[0];dis[0]=0;
que.push(temp);
while(!que.empty())
{
temp=que.top();que.pop();
if(vis[temp.v]) continue;
//printf("%d\n",temp.v);
vis[temp.v]=1;
for(int i=head[temp.v];i;i=edge[i].next)
{
//printf("%d*\n",edge[i].v);
if(dis[edge[i].v]>dis[temp.v]+edge[i].w)
{
//printf("%d ADD\n",edge[i].v);
dis[edge[i].v]=dis[temp.v]+edge[i].w;
tmp.v=edge[i].v;
tmp.w=dis[edge[i].v];
que.push(tmp);
}
}
}
}
bool cover(int s1,int t1,int s2,int t2)
{
if(t2<=t1) return 0;
return (s2>=s1&&t2<=t1)||(((s2<=s1&&t2>=s1)||(s2<=t1&&t2>=t1)));
}
int main()
{
scanf("%d %d",&n,&m); for(int i=1;i<=m;i++)
{
scanf("%d %d %lld",&u[i],&v[i],&w[i]);
if(u[i]==1) AddEdge(0,i,w[i]);
}
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
if(i!=j&&cover(u[i],v[i],u[j],v[j])) AddEdge(i,j,w[j]);
Dijkstra();
long long ans=LLONG_MAX;bool flag=0;
for(int j=1;j<=m;j++)
if(v[j]==n){ans=std::min(ans,dis[j]);}
printf("%lld",(ans==LLONG_MAX||ans==sample)?-1:ans);
return 0;
}

NIKKEI Programming Contest 2019-2 D 部分分题解的更多相关文章

  1. [AtCoder] NIKKEI Programming Contest 2019 (暂缺F)

    [AtCoder] NIKKEI Programming Contest 2019   本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder ...

  2. AtCoder NIKKEI Programming Contest 2019 C. Different Strokes (贪心)

    题目链接:https://nikkei2019-qual.contest.atcoder.jp/tasks/nikkei2019_qual_C 题意:给出 n 种食物,Takahashi 吃下获得 a ...

  3. NIKKEI Programming Contest 2019 翻车记

    A:签到. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> ...

  4. atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges

    题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...

  5. 【AtCoder】全国統一プログラミング王決定戦予選/NIKKEI Programming Contest 2019

    感觉最近好颓,以后不能这么颓了,要省选了,争取省选之前再板刷一面ATC??? A - Subscribers 简单容斥 #include <bits/stdc++.h> #define f ...

  6. AtCoder NIKKEI Programming Contest 2019 E. Weights on Vertices and Edges (并查集)

    题目链接:https://atcoder.jp/contests/nikkei2019-qual/tasks/nikkei2019_qual_e 题意:给出一个 n 个点 m 条边的无向图,每个点和每 ...

  7. [AtCoder] Yahoo Programming Contest 2019

    [AtCoder] Yahoo Programming Contest 2019   很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...

  8. 2020.3.14--训练联盟周赛 Preliminaries for Benelux Algorithm Programming Contest 2019

    1.A题 题意:给定第一行的值表示m列的最大值,第m行的值表示n行的最大值,问是否会行列冲突 思路:挺简单的,不过我在一开始理解题意上用了些时间,按我的理解是输入两组数组,找出每组最大数,若相等则输出 ...

  9. Yahoo Programming Contest 2019 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

随机推荐

  1. HeroM2连击技能设置和DB完整数据

    连击技能设置: M2\选项\功能设置\技能魔法\通用技能\连击技能 魔法DB: 81;倚天辟地;0;55;5;10;10;5;6;6;99;15;5;15;10;15;15;60;; 300;万剑归宗 ...

  2. P1426

    和上次的小鱼题差不多,但多了一些条件. 先把游到 $ s - x $ 米是第 $ a_i $ 秒求出来,然后判断之后在第 $ a_{i + 1} $ 秒内游的距离是否 $ \geq 2x $ ,大于就 ...

  3. 《JavaScript高级程序设计》读书笔记(三)基本概念第五小节流程控制语句

    内容---语法 ---数据类型 上一小节---流程控制语句 本小节---理解函数 语句--ECMA-262规定了一组语句,也称流程控制语句 if语句-- 条件可以是任意表达式,-- ECMAScrip ...

  4. Linux - 常用GUI软件

    1. gdebi -- 可以代替Ubuntu software安装软件 2. System monitor -- 监控流量 3. uget -- 下载软件 4. Okular -- pdf reade ...

  5. VBA 学习笔记 - 日期

    date() 返回当前的系统日期 返回格式为 YYYY/MM/DD CDate() 学习资料:https://www.yiibai.com/vba/vba_cdate_function.html 将有 ...

  6. JavaSE复习~Java语言发展史

    Java概述 什么是Java语言? Java语言是美国Sun公司(Stanford University NetWork),在1995年推出的高级编程语言. 所谓编程语言,是计算机的语言,人们可以使用 ...

  7. 树莓派 Ubuntu mate 16.04 下开启vncserver(自动启动+改分辨率)

    树莓派 Ubuntu mate 16.04 下开启vncserver(自动启动+改分辨率) 参考博文:https://blog.csdn.net/Mr_dhy/article/details/8282 ...

  8. 杭电 1114 Piggy-Bank 完全背包问题

    Piggy-Bank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. Postgresql查询表和表结构

    查询表名 SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' O ...

  10. 《JavaScript高级程序设计》读书笔记(序)

    1.现大三暑假中,计划9月初北上找前端工作,大三一年时间都在健身和学习专业课知识,技术有点荒废了,7月份忙于学校安排的实习javaweb方向的,到现在才有整段的时间好好把基础巩固一. 2.这几天也在关 ...