题目链接:点击查看

题目大意:给出 n 个点和 m 条边的有向图,每条边的长度为 1 ,有一个属性由 0 或 1 表示,现在需要给每个节点赋值,使得:

  1. 如果点 u 的权值为 0 ,则 u 只能走 ( u , v ) 且这条边的属性为 0 的边
  2. 如果点 u 的权值为 1 ,则 u 只能走 ( u , v ) 且这条边的属性为 1 的边

问如何赋值能让点 1 到点 n 的最短路最大,输出一种构造方案

题目分析:首先设计 dp ,为了契合最短路的模板,在这个题目中我用 d 数组作为 dp 数组,d[ i ][ 0 ] 和 d[ i ][ 1 ] 分别表示 i 点为 0 或 1 时,到达点 n 的最短路,显然比较 d[ i ][ 0 ] 和 d[ i ][ 1 ] 的大小,选较大的为点 i 赋值就能让最短路最大了,当两者相等时,赋值为 0 或 1 都是一样的

然后考虑 dp 的转移,因为我们要求以 n 个点为起点的 d[ i ][ 0 ] 和 d[ i ][ 1 ] ,肯定是不能求 n 次迪杰斯特拉的,又因为所有的 d 数组都是以点 n 为终点的,所以我们不妨将整个图翻转,然后求以点 n 为起点的单源最短路

下面说一下该如何转移状态方程,假如现在有一条由 u 向 v 的边,且该边的属性为 t ,因为我们要使得最短路最大,所以显然要用 max( d[ u ][ 0 ] , d[ u ][ 1 ] ) 向点 v 进行转移,这就是最简单的最短路问题了,因为这个题目中的边权都为 1 ,所以我们可以用 bfs 来代替迪杰斯特拉

有一点需要注意的是,因为每个点有两个属性需要更新,所以每个点可能会被遍历多次,如果像普通迪杰斯特拉那样加一个 vis 限制的话,可能会导致答案错误,所以我们换一种方法来约束,在代码实现中会打上注释,其效果与 vis 标记的效果是一样的

最后的答案显然就是 max( d[ 1 ][ 0 ] , d[ 1 ][ 1 ] ) 了,方案的话按照求出来的数组直接构造即可

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=5e5+100;vector<pair<int,int>>node[N];int dis[N][2],n,m;void bfs()
{memset(dis,inf,sizeof(dis));dis[n][0]=dis[n][1]=0;queue<pair<int,int>>q;q.push(make_pair(n,0));while(q.size()){int u,w;tie(u,w)=q.front();q.pop();if(max(dis[u][0],dis[u][1])!=w)//用来代替vis的一句话continue;for(auto t:node[u]){int v=t.first;int type=t.second;if(dis[v][type]>max(dis[u][0],dis[u][1])+1){dis[v][type]=max(dis[u][0],dis[u][1])+1;q.push(make_pair(v,max(dis[v][0],dis[v][1])));}}}
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%d%d",&n,&m);while(m--){int u,v,c;scanf("%d%d%d",&u,&v,&c);node[v].emplace_back(u,c);}bfs();int ans=max(dis[1][0],dis[1][1]);if(ans==inf)ans=-1;printf("%d\n",ans);for(int i=1;i<=n;i++)if(dis[i][0]>=dis[i][1])putchar('0');elseputchar('1');return 0;
}

CodeForces - 1407E Egor in the Republic of Dagestan(最短路+dp)相关推荐

  1. CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)

    CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...

  2. Codeforces 1088E Ehab and a component choosing problem(树形DP)

    Codeforces 1088E Ehab and a component choosing problem(树形DP) 题意 给一棵树,要求从中选一些联通分量,使得平均联通分量重量总和最大.如果有多 ...

  3. Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp

    C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...

  4. Codeforces 1264C/1265E Beautiful Mirrors with queries (概率期望、DP)

    题目链接 http://codeforces.com/contest/1264/problem/C 题解 吐槽:为什么我赛后看cf的题就经常1h内做出Div.1 C, 一打cf就动不动AB题不会啊-- ...

  5. Codeforces Gym 101630J Travelling from Petersburg to Moscow (最短路)

    题目链接 http://codeforces.com/gym/101630/attachments 题解 zyb学长的题. 先枚举第\(k\)大的边权,设其边权为\(x\),然后把每条边边权减掉\(x ...

  6. Codeforces Gym 101630J Journey from Petersburg to Moscow (最短路)

    题目链接 http://codeforces.com/gym/101630/attachments 题解 zyb学长的题. 先枚举第\(k\)大的边权,设其边权为\(x\),然后把每条边边权减掉\(x ...

  7. Codeforces 947E/923E Perpetual Subtraction (线性代数、矩阵对角化、DP)

    手动博客搬家: 本文发表于20181212 09:37:21, 原地址https://blog.csdn.net/suncongbo/article/details/84962727 呜啊怎么又是数学 ...

  8. Codeforces Round #450 (Div. 2)D. Unusual Sequences[数论][组合数学][dp II]

    题目:http://codeforces.com/contest/900/problem/D 题意:找到加和为m的且gcd为n的数列种类数 分析:可以转化为求gcd为1的加和为m/n的种类数,假设有m ...

  9. Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes kmp + dp

    传送门 文章目录 题意: 思路: 题意: 思路: 通过完美子串的定义,我们不难发现满足条件的子串就是kmpkmpkmp中ne[n]ne[n]ne[n]不断向前跳得到的串,现在问题就是如何求这些前缀串在 ...

最新文章

  1. 机器学习模型五花八门不知道怎么选?这份指南告诉你
  2. php reactphp wss_php无限级分类 - ▄︻┻┳000000000000000000000000000000000000 - OSCHINA - 中文开源技术交流社区...
  3. [导入]MsAjax Lib- Array.insert 函数
  4. iOS朋友圈,视频播放器、钓鱼小游戏、玻璃动画源码
  5. 软件需求说明书谁负责写_新手入门软件测试需要掌握哪些知识点?
  6. php符号%3c%3e啥意思,[PHP防火墙]输入内容存在危险字符,安全起见,已被本站拦截...
  7. Cisco IOS Cookbook 中文精简版(续)
  8. android mediarecorder 输出到流_音视频的采集、编码、封包成 mp4 输出
  9. php生成透明png图像 无锯齿
  10. 手动安装.app到模拟器simulator, iOS XCode 11
  11. qtp测试 java web_QTP之web常用对象
  12. matlab iradon函数详解,如何处理iradon函数所得图像
  13. DevCpp 如何进行调试
  14. ntpdate 安装_SAS 9.4 安装教程
  15. python 二项分布
  16. ai如何置入_ai中更新置入图片链接的具体步骤介绍
  17. python用math运行三角函数_Python中的数学模块:Math和Cmath 算术函数 三角函数 双曲函数 幂函数和对数函数 复数......
  18. python echarts城市热力图_echarts绘制各省、市、区的热力图
  19. Mysql操作语句大全
  20. 正则表达式匹配非某字符串的情况

热门文章

  1. 读写分离mysql数据库mariadb_MariaDB数据库读写分离实现(一):mysql-proxy的使用
  2. 自定义JWT认证过滤器
  3. 平衡二叉树(AVL Tree)(左旋、右旋)
  4. 初步认识Volatile-什么叫缓存一致性呢?
  5. TCP/IP的分层负载
  6. 微信支付 - 提供支付中心商户订单查询
  7. 微信支付 - 构建商户端支付成功的回调接口
  8. Redis在生产中不得不重视的几个运维问题
  9. 反射_获取字节码Class对象的三种方式
  10. response对象简介