请注意本文章所描写的算法只可以获得前 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. php虚拟主机下实现定时任务(仅供参考)

    因为要做简单的中控  在实现心跳包的时候遇到了困难 正常的心跳包思路是这样的  举个例子 我写一个登陆签到脚本   当我登陆成功的时候 会把登陆成功这个状态传递给网络上的中控端 当我签到完成的时候会把 ...

  2. HTTPS 学习

    问题 数字签名的作用是什么? 为什么 HTTPS 是安全的 CA存在的动机是什么 客户端的公钥的都是一致的吗? 概述 这一节我们将要讲HTTPS,为什么说HTTPS是安全的,而HTTP是不安全的呢,这 ...

  3. ios 用touchend事件 pc用click touchend击穿

    var clickEvent = (function() { if ('ontouchend' in document.documentElement === true) return 'touche ...

  4. CSS-复选框默认样式修改

    在css文件中添加如下代码 input[type='checkbox'] { -webkit-appearance: none; background: #fff url('../../static/ ...

  5. MySQL 将字符串转换为数字

    转载自:https://www.cnblogs.com/xiaoleiel/p/8316508.html 在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在 ...

  6. 卸载mysql时,提示libmysqlclient.so.16()(64bit) is needed by (installed) postfix

    卸载时,提示错误,用这个命令就可以rpm -e --nodeps mysql-libs-5.1.73-5.el6_6.x86_64(这个是自己要卸载的版本) [root@unaryhost dev]# ...

  7. PyQt5打印机

    1.打印机操作(打印默认文本里面的内容)from PyQt5 import QtGui,QtWidgets,QtPrintSupportfrom PyQt5.QtWidgets import *imp ...

  8. 吴裕雄--天生自然Numpy库学习笔记:NumPy 高级索引

    import numpy as np x = np.array([[1, 2], [3, 4], [5, 6]]) y = x[[0,1,2], [0,1,0]] print (y) import n ...

  9. RADIUS Authentication with WPA2-Enterprise

    概观具有802.1X身份验证的WPA2-Enterprise可用于对域中的用户或计算机进行身份验证.请求方supplicant(无线客户端)使用RADIUS服务器上配置的EAP方法对RADIUS服务器 ...

  10. 动态规划-爬楼梯问题java实现

    最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划.提起动态规划就不得不提几个动态规划的金典问题爬楼梯.国王金矿.背包问题.今天就仔细分析一下爬楼梯问题. ...