CF666B. World Tour

题意:

给定一张边权为 1 的有向图,求四个不同点 A, B, C, D
使得 dis(A, B) + dis(B, C) + dis(C, D) 取最大值,dis表示最短路距离 1 ≤ n ≤ 3000, 1 ≤ m ≤ 5000


我又写了假做法呜呜呜

首先当然\(O(nm)\)预处理两点之间最短路

然后预处理出从每个点开始前3个dis最大的点

假做法:

贪心,枚举A,贪心选择dis较大的BCD,就是3*3*3搜索选出B、C、D

假的原因:

贪心不成立,因为前面会影响后面,可以先差,再优、优

真做法:

再预处理到达每个点的前3个dis最大的点

枚举B、C,再3*3选出A、D,选A、D不会像之前那样互相干扰了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e4+5, inf = 1e9;int n, m;
struct edge {int v, ne;} e[N];
int cnt, h[N], d[N][N];
inline void ins(int u, int v) {e[++cnt] = (edge) {v, h[u]}; h[u] = cnt;
}int q[N], head, tail, vis[N];
#define fir first
#define sec second
pair<int, int> a[N], f[N][5], g[N][5];
void bfs(int s) {memset(vis, 0, sizeof(vis));head = tail = 1;q[tail++] = s; vis[s] = 1;memset(d[s], 0x3f, sizeof(d[s]));int *dis = d[s];dis[s] = 0;while(head != tail) {int u = q[head++];for(int i=h[u]; i; i=e[i].ne) {int v = e[i].v;if(vis[v]) continue;dis[v] = dis[u] + 1;vis[v] = 1;q[tail++] = v;}}
}
void solve(int s) {int cnt = 0;for(int i=1; i<=n; i++) if(i!=s && d[s][i] < inf) a[++cnt] = make_pair(d[s][i], i);for(int i=cnt+1; i<=3; i++) a[i] = make_pair(0, 0);sort(a+1, a+cnt+1, greater<pair<int, int> >());f[s][1] = a[1], f[s][2] = a[2], f[s][3] = a[3];cnt = 0;for(int i=1; i<=n; i++) if(i!=s && d[i][s] < inf) a[++cnt] = make_pair(d[i][s], i);for(int i=cnt+1; i<=3; i++) a[i] = make_pair(0, 0);sort(a+1, a+cnt+1, greater<pair<int, int> >());g[s][1] = a[1], g[s][2] = a[2], g[s][3] = a[3];//if(s == 1) printf("hi %d %d %d\n", a[1].sec, a[2].sec, a[3].sec);//printf("sssssssssssssssssssssssssssss %d\n", s);//for(int i=1; i<=3; i++) printf("f %d   %d %d\n", i, f[s][i].fir, f[s][i].sec);
}int ans, li[10];
int main() {//freopen("in", "r", stdin);ios::sync_with_stdio(false); cin.tie(); cout.tie();cin >> n >> m;for(int i=1; i<=m; i++) {int u, v;cin >> u >> v;if(u != v && !d[u][v]) ins(u, v), d[u][v] = 1;}for(int i=1; i<=n; i++) bfs(i);for(int i=1; i<=n; i++) solve(i);for(int b=1; b<=n; b++)for(int c=1; c<=n; c++) if(d[b][c] < inf && c != b) {int now = d[b][c];for(int i=1; i<=3; i++) {pair<int, int> &ra = g[b][i];int a = ra.sec;if(a == b || a == c || !ra.fir) continue;now += ra.fir;for(int j=1; j<=3; j++) {pair<int, int> &rd = f[c][j];int d = rd.sec;if(d ==a || d == b || d == c || !rd.fir) continue;now += rd.fir; if(now > ans) {ans = now;li[1] = a; li[2] = b; li[3] = c; li[4] = d;}now -= rd.fir;}now -= ra.fir;}}for(int i=1; i<=4; i++) cout << li[i] << ' ';
}

CF666B. World Tour相关推荐

  1. usaco Canada Tour

    没想到用dp,写完才发现这就是floyd求最大环..... /* ID:jinbo wu TASK:tour LANG:C++ */ #include<bits/stdc++.h> usi ...

  2. Codeforces 894.D Ralph And His Tour in Binary Country

    D. Ralph And His Tour in Binary Country time limit per test 2.5 seconds memory limit per test 512 me ...

  3. poj 2677 tour

    2019独角兽企业重金招聘Python工程师标准>>> /*G:Tour查看提交统计提问总时间限制: 1000ms内存限制: 65536kB 描述 John Doe, a skill ...

  4. Bzoj3060 [Poi2012]Tour de Byteotia

    3060: [Poi2012]Tour de Byteotia Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 251  Solved: 161 De ...

  5. HDOJ 1224 Free DIY Tour

    简单DP Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. knight tour java_The Knight’s tour problem

    Backtracking | Set 1 (The Knight's tour problem骑士周游算法 ) Backtracking is an algorithmic paradigm that ...

  7. POJ 1637 Sightseeing tour(最大流)

    POJ 1637 Sightseeing tour 题目链接 题意:给一些有向边一些无向边,问能否把无向边定向之后确定一个欧拉回路 思路:这题的模型很的巧妙,转一个http://blog.csdn.n ...

  8. 最大流增广路(KM算法) HDOJ 1853 Cyclic Tour

    题目传送门 1 /* 2 KM: 相比HDOJ_1533,多了重边的处理,还有完美匹配的判定方法 3 */ 4 #include <cstdio> 5 #include <cmath ...

  9. 骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)

    说明:骑士旅游(Knight tour)在十八世纪初倍受数学家与拼图迷的注意,它什么时候被提出已不可考,骑士的走法为西洋棋的走法,骑士可以由任一个位置出发,它要如何走完[所有的位置? 解法:骑士的走法 ...

最新文章

  1. Android 替换TextView 里面指定的符号
  2. 数据集轻松按需搜索,这个工具汇集近2000个图像数据集,可免费获取|Reddit高热...
  3. 【ES6】对象、函数、数组的扩展
  4. UE4 iOS设备的兼容性
  5. Java编程中“为了性能”尽量要做到的一些地方 [转]
  6. CPU的IPC调优:通过优化代码,提高每个时钟的指令数
  7. Faster R-CNN源码中ROI Pooling的解析
  8. 用 Markdown 写作(一)——添加文章页内导航
  9. 让我们旋转跳跃不停歇~~~当3D打印遇上八音盒!(一)
  10. 好程序员分享面向对象概念的理解以及ES3和ES6中类的写法
  11. HDU 5602 Black Jack (记忆化搜索+DP)*
  12. 平台如何实现实人认证?
  13. 亚马逊测评:最前沿养号系统,如何降低成本提高效率搭建稳定的ip环境
  14. 【LOJ2867】「IOI2018」高速公路收费
  15. 产品30讲之产品周期
  16. python输入年月日判断什么星座_输入月份和日期给出对应星座
  17. 雷军-我十年的程序员生涯
  18. mysql md5 多少位_mysql的MD5加密后的字符能不能设定长度
  19. 名帖145 行书《兰亭八柱帖》第三册:冯承素摹兰亭序
  20. 使用while语句与do...while语句计算多个整数的和

热门文章

  1. 怎么让sql查询的字段可以不出现在group分组里_在工作中常用到的SQL
  2. 魔众Markdown管理系统v2.1.0源码
  3. laravel 如何 new php 类,PHP实例:laravel通过创建自定义artisan make命令来新建类文件详解...
  4. 伯乐发卡系统源码 可用
  5. 百度网盘直接解析高速下载文件源码
  6. 织梦cms高端红酒酒业类网站模板
  7. 搜集侠采集织梦系统模板
  8. Spring Boot开发框架优点诠释
  9. MooTools教程(3):数组管理DOM元素
  10. javascript基本数据类型与值类型引用类型说明