graph - hzw模拟赛Test13

Dp

题解:

注意到,如果按照要求走,这个图是没有环的!

然而我一开始并没有注意到这一点(或者是没仔细往下想),去写spfa了。。。

简单说一下我2s+的spfa,就是d[i][j]表示在i这个点,上一条边距离为j的最长路径的边数。注意到一个点均摊只有O(1)个有用状态,因此可以把j表示成能到达i点的第j大的边,另外开一个vector保存具体长度是几。当然d和vis也是vector。然后直接spfa。

Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#define MP make_pair
#define D(x) cout<<#x<<" = "<<x<<"  "
#define E cout<<endl
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 500005;int n,m; int ans;
vector<int> len[N], d[N];
vector<bool> vis[N];
struct Edge{ int to,nxt,w,id; } e[N<<1];
int head[N],ec;
void add(int a,int b,int w){ec++; e[ec].to=b; e[ec].w=w; e[ec].nxt=head[a]; head[a]=ec;
}void spfa(){queue<pii> q; for(int i=1;i<=n;i++){ q.push(MP(i,0)); vis[i][0]=true; }while(!q.empty()){int u=q.front().first, x=q.front().second, pre=len[u][x]; q.pop(); vis[u][x]=false;
//      D(u); D(x); D(pre); E;ans=max(ans,d[u][x]);for(int i=head[u];i;i=e[i].nxt) if(e[i].w > pre){int v=e[i].to, y=e[i].id;
//          D(v); D(y); E;if(d[v][y] < d[u][x] + 1){d[v][y] = d[u][x] + 1;if(!vis[v][y]){ vis[v][y]=true; q.push(MP(v,y)); }}}}
}int main(){freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) len[i].push_back(0);int a,b,w;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&w);add(a,b,w); len[b].push_back(w);}for(int i=1;i<=n;i++) sort(len[i].begin(),len[i].end());for(int i=1;i<=ec;i++){int v=e[i].to;e[i].id=lower_bound(len[v].begin(),len[v].end(),e[i].w)-len[v].begin();}for(int i=1;i<=n;i++){ vis[i].resize(len[i].size(),false); d[i].resize(len[i].size(),0); }
//  for(int i=1;i<=n;i++){//      D(i); E;
//      for(int j=1;j<len[i].size();j++){//          printf("%d ",len[i][j]);
//      } E;
//  }
//  for(int i=1;i<=ec;i++){//      D(e[i].to); D(e[i].w); D(e[i].id); E;
//  }spfa(); printf("%d\n",ans);
}

————————————正解————————————

把边从小到大依次加入,f[i]表示当前到达i的最长路径的边数,
f[to]=max(f[to],f[from]+1)f[to]=max(f[to],f[from]+1)
因为是严格大于,所以等于的不能互相转移,因此开一个临时数组g,转移时先更新g,当边权相等的边转移完了在把g赋值给f即可。

Code:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
using namespace std;
const int N = 500005;int n,m,ans,ec;
int f[N],g[N];
stack<int> s;struct Edge{int u,v,w;Edge(){}Edge(int a,int b,int _w){ u=a; v=b; w=_w; }bool operator < (const Edge &other) const{return w < other.w;}
} e[N];int main(){freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);scanf("%d%d",&n,&m);int a,b,w;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&w);e[++ec]=Edge(a,b,w);}sort(e+1,e+1+ec);for(int i=1;i<=ec+1;i++){if(e[i].w!=e[i-1].w){while(!s.empty()){f[s.top()]=g[s.top()]; s.pop();}}g[e[i].v]=max(g[e[i].v],f[e[i].u]+1);s.push(e[i].v);}for(int i=1;i<=n;i++) ans=max(ans,f[i]);printf("%d\n",ans);
}

总结:

没有好好挖掘题目性质。

graph - hzw模拟赛Test13相关推荐

  1. 送分题 - hzw模拟赛Test10

    送分题 - hzw模拟赛Test10 树形Dp 题解: 啊啊啊好难啊,送分题都这么难... • 这题可以先设 f(u; k) 表示以节点 u 为根的⼦树中,在⽅案 合法的情况下,选中的点中离 u 最近 ...

  2. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  3. 2017.6.11 校内模拟赛

    题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小cop ...

  4. 2020年蓝桥杯模拟赛2020.3.25直播笔记

    2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...

  5. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  6. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  7. 蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载【2013年(第4届)~2021年(第12届)】

    蓝桥杯 Java B组 省赛决赛模拟赛 详解及小结汇总+题目下载[2013年(第4届)~2021年(第12届)] 百度网盘-CSDN蓝桥杯资料(真题PDF+其它资料)   提取码:6666 2013年 ...

  8. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  9. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

最新文章

  1. 开发日记-20190905 关键词 Linux (Ubuntu) 下的Android模拟器:Genymotion
  2. [JZOJ P1311] [DP]邮局设置问题
  3. 安卓学习笔记19:常用控件 - 单选按钮和复选框
  4. 在Chrome离线安装插件时显示程序包无效: CRX_HEADER_INVALID
  5. WPF中作用MEF报错The export Xyz is not assignable to type IXyz是设计器问题
  6. Atiitt 文档处理之道 attilax著
  7. 苦劝学弟学妹们,explain一定要学明白,以后有大用途
  8. 【Auto.JS】入门宝典—Auto.JS开发使用笔记(随笔和使用心得)
  9. 测试用例管理工具有哪些?
  10. iOS面试 swift篇
  11. 微信h5页面中下载app(apk)的解决方案
  12. 工控组态编程相关知识点介绍
  13. CSS-盒子模型,标准盒子模型,IE 盒子模型,盒模型之间的转换
  14. android 推送图标大小,设计方法论:一种统一图标大小的方法
  15. 孕妇适合吃哪些蔬菜?这三种蔬菜很有营养
  16. 关系型数据库的瓶颈 与 优化
  17. app按钮没反应android,求助,uni-app按钮点击没反应
  18. git基本命令的理解
  19. C语言:用贪心策略计算活动安排问题的最优解
  20. android内容提供者实验报告,实验报告审核的19个要点

热门文章

  1. 解决问题最简单的方法
  2. 联想小新笔记本充不上电——客服提供的处理办法(已解决)
  3. 畅游电驴/电骡(emule) 1.0 发布-下载网络资源的利器
  4. html怎么电视连电脑,电脑怎么投屏到电视?图文讲解电脑投屏具体方法步骤
  5. Outlook如何将导航栏从左侧移动到底部
  6. 告诉你那里最受欢迎,python爬取全国13个城市旅游数据
  7. linemod算法小结
  8. E销宝:dsp广告应该怎么投放?
  9. 电脑缩小,电脑网页缩小了怎么恢复?电脑网页缩小的三种恢复方法
  10. win10taskkill强行结束进程_win10强制关闭应用程序的方法