Codeforces Round #349 (Div. 2) D. World Tour
来源:互联网 发布:取消映射网络驱动器 编辑:程序博客网 时间:2024/05/29 18:40
给出n个点m条边的有向图, 每条边的长度为1
要求找出四个点a,b,c,d使得 a->b + b->c + c->d 的距离最大 其中a->b ,b->c ,c->d代表两点之间的最短路径
(1<=n<=3000) (1<=m<=5000)
思路
因为时间给了
#include <set>#include <map>#include <stack>#include <queue>#include <deque>#include <cmath>#include <vector>#include <string>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define L(i) i<<1#define R(i) i<<1|1#define INF 0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-9#define maxn 10010#define MOD 1000000007struct Edge{ int to,next;}edge[maxn];int n,m;int tot,head[maxn],vis[maxn];int dis[3030][3030];vector<pair<int,int> > d1[maxn],d2[maxn];void init(){ tot = 0; memset(head,-1,sizeof(head));}void add_edge(int u,int v){ edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++;}void bfs(int u){ queue<int> q; q.push(u); while(!q.empty()) { int x = q.front(); q.pop(); for(int i = head[x]; i != -1; i = edge[i].next) { int y = edge[i].to; if(dis[u][y] || y == u) continue; dis[u][y] = dis[u][x] + 1; q.push(y); } }}int main(){ int t,C = 1; //scanf("%d",&t); while(scanf("%d%d",&n,&m) != EOF) { init(); for(int i = 0; i < m; i++) { int x,y; scanf("%d%d",&x,&y); add_edge(x,y); } memset(dis,0,sizeof(dis)); for(int i = 1; i <= n; i++) bfs(i); for(int i = 1; i <= n; i++) { d1[i].clear(); d2[i].clear(); } for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { if(!dis[i][j]) continue; d2[i].push_back(make_pair(dis[i][j],j)); d1[j].push_back(make_pair(dis[i][j],i)); } for(int i = 1; i <= n; i++) { sort(d1[i].rbegin(),d1[i].rend()); sort(d2[i].rbegin(),d2[i].rend()); } int ans = 0; int v1,v2,v3,v4; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { if(!dis[i][j]) continue; for(int ii = 0; ii < min(4,(int)d1[i].size()); ii++) for(int jj = 0; jj < min(4,(int)d2[j].size()); jj++) { int u = d1[i][ii].second; int v = d2[j][jj].second; if(u == j || i == v || !dis[u][v]) continue; if(dis[u][i] + dis[i][j] + dis[j][v] > ans) { ans = dis[u][i] + dis[i][j] + dis[j][v]; v1 = u; v2 = i; v3 = j; v4 = v; } } } //printf("%d\n",ans); printf("%d %d %d %d\n",v1,v2,v3,v4); } return 0;}
- Codeforces Round #349 (Div. 2) D. World Tour
- Codeforces Round #349 (Div. 2) D. World Tour 【spfa+暴力枚举】
- Codeforces Round #349 (Div. 1) B. World Tour
- Codeforces Round #349 (Div. 1) B. World Tour (暴力搜索)
- Codeforces Round #447 (Div. 2) D. Ralph And His Tour in Binary Country
- Codeforces Round #447 (Div. 2) D. Ralph And His Tour in Binary Country(dfs)
- Codeforces Round #279 (Div. 2) F. Treeland Tour
- Codeforces Round #447(Div.2)Problem D Ralph And His Tour in Binary Country(归并排序+二分)
- Codeforces Round #447 (Div. 2) D. Ralph And His Tour in Binary Country 二叉树、预处理、二分、数据结构
- Codeforces 66D World tour BFS+枚举
- Codeforces Round #103 (Div. 2) D
- Codeforces Round #104 (Div. 2) D
- Codeforces Round #105 (Div. 2) D
- Codeforces Round #139 (Div. 2) D. Snake
- Codeforces Round #155 (Div. 2) D-rats
- Codeforces Round #159 (Div. 2) D sum
- Codeforces Round #184 (Div. 2) D、E
- Codeforces Round#186(Div 2) D
- Qt 在VS下使用添加新类后报错LNK2019无法解析的外部符号解决办法
- visual studio 2015怎么下载
- C# HTML解析工具HtmlAgilityPack XPath 模糊查询not()函数和contains()函数
- leetcode-21 Merge Two Sorted Lists
- 代码性能测试
- Codeforces Round #349 (Div. 2) D. World Tour
- 安装 、 使用codeblocks
- Swift学习记录 -- 1.常量与变量
- sublime Text
- linux服务器配置教程
- NLP:实体识别
- STL常用的拷贝替换算术集合算法
- 最常用的 Eclipse 快捷键总结
- Qt openGL基础教程