UVa 1057 - Routing
先声明一下:这篇题解纯粹是对原题解的翻译与修复,并非原创。
解法是 DP + 最短路。这个思想并不是很少见,而这题强化了 DP 的思维难度。
设 f[i][j] 为 1~i,2~j 所经过的点数最少的路径的点数(考虑了重复点)。
给出转移方程:
f[i2][j] = min(f[i][j] + [i2 != j] | g[i][i2] = 1)
f[i][j2] = min(f[i][j] + [i != j2] | g[j2][j] = 1)
f[j][i] = min(f[j][i], f[i][j] + dis[i][j] - 1)
(f 是 DP 数组,dis 为两点最短路,g 是邻接矩阵)
初始化 f[1][1] = 1,那么答案就是 f[2][2]。
反着来是类似的。
#include <bits/stdc++.h>using namespace std;const int N = 100 + 5; const int INF = 0x3f3f3f3f; int dis[N][N]; int f[N][N]; bool inq[N][N]; vector<int> g1[N], g2[N];int main() { int n, m, kase = 0;while (scanf("%d %d", &n, &m) == 2 && n) {for (int i = 1; i <= n; i++) {g1[i].clear();g2[i].clear();}memset(dis, INF, sizeof dis);for (int i = 1; i <= n; i++) {dis[i][i] = 0;}for (int i = 1; i <= m; i++) {int u, v;scanf("%d %d", &u, &v);dis[u][v] = 1;g1[u].push_back(v);g2[v].push_back(u);}for (int k = 1; k <= n; k++) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);}}}printf("Network %d\n", ++kase);if (dis[1][2] != INF && dis[2][1] != INF) {memset(f, INF, sizeof f);f[1][1] = 1;queue<int> q1, q2;q1.push(1);q2.push(1);inq[1][1] = true;while (!q1.empty()) {int u1 = q1.front(), u2 = q2.front();q1.pop(); q2.pop();inq[u1][u2] = false;for (int i = 0; i < g1[u1].size(); i++) {int v1 = g1[u1][i]; int cand = f[u1][u2] + (v1 != u2);if (cand < f[v1][u2]) {f[v1][u2] = cand;if (!inq[v1][u2]) {q1.push(v1);q2.push(u2);inq[v1][u2] = true;}}}for (int i = 0; i < g2[u2].size(); i++) {int v2 = g2[u2][i];int cand = f[u1][u2] + (v2 != u1);if (cand < f[u1][v2]) {f[u1][v2] = cand;if (!inq[u1][v2]) {q1.push(u1);q2.push(v2);inq[u1][v2] = true;}}}if (u1 != u2 && f[u1][u2] + dis[u1][u2] - 1 < f[u2][u1]) {f[u2][u1] = f[u1][u2] + dis[u1][u2] - 1;if (!inq[u2][u1]) {q1.push(u2);q2.push(u1);inq[u2][u1] = true;}}}printf("Minimum number of nodes = %d\n", f[2][2]);} else {printf("Impossible\n");}printf("\n");}return 0; }
View Code
转载于:https://www.cnblogs.com/HailJedi/p/9588256.html
UVa 1057 - Routing相关推荐
- UVa Online Judge 工具網站
UVa Online Judge 工具網站 转自http://www.csie.ntnu.edu.tw/~u91029/uva.html Lucky貓的ACM園地,Lucky貓的 ACM 中譯題目 M ...
- RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)
1. simple 模式 simple 模式是最简单最常用的模式 2. work 模式 work 模式有多个消费者 消息产生者将消息放入队列.生产者系统不需知道哪一个任务执行系统在空闲,直接将任务扔到 ...
- [搜索]UVa 129 困难的串
题意:将一个包含两个相邻的重复子串的子串,称为"容易的串",其他为"困难的串". 输入正整数n和l,输出由前l个字符组成的,字典序第n小的困难的串. 输入样例: ...
- uva 401.Palindromes
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- Uva 3767 Dynamic len(set(a[L:R])) 树套树
Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...
- UVA 11752 超级幂
UVA 11752 超级幂 Z - The Super Powers Time Limit:1000MS Memory Limit:0KB 64bit IO Format:%lld & ...
- UVa 11174 - Stand in a Line
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVa 10112 - Myacm Triangles
UVa第一卷最后一题. 求内部不含点并且面积最大的三角形. 暴力. 代码如下: 1 #include<iostream> 2 #include<cstdio> 3 #inclu ...
- 一步步学会使用ASP.NET 4 WEB应用程序中使用URL Routing(翻译)
创建路由 路由就是将URL路径映射到具体的物理文件.若要将路由添加到网站中,请使用 RouteCollection.MapPageRoute 方法将它们添加到RouteTable类的静态Routes属 ...
最新文章
- rootkit 检测报告
- CentOS安装网卡设置
- 三个程序代码托管平台出现勒索事件? 建议启用多因素验证以保护账户
- .Net 编码以及与这些编码关联的代码页
- Linux常用命令集锦
- (选择 冒泡 插入 二分 异或)
- Spring Security 示例UserDetailsS​​ervice
- 带有服务器回调的通用客户端——服务器 DotNet远程处理
- python矩阵转置与zip(*)的使用
- 中国移动:2016年全力推NFC,以公共交通为突破口
- 单片机定时器实验两位倒计时秒表_Proteus入门单片机(3)例程分析
- Coin3D快速上手教程
- 简单理解-Head First 设计模式
- 判断是否是微信浏览器还是企业微信浏览器
- luogu 2735 电网 皮克公式
- mac 打开虚拟机之后,原MAC没有声音解决方法
- centos桌面系统怎么退回终端系统_CentOS下命令行和桌面模式的切换方法
- JSP WebSehll 后门脚本
- java毕业生设计在线答题系统计算机源码+系统+mysql+调试部署+lw
- 一个屌丝程序员的青春(四九)