@description@

一个 n 个点的无向简单的连通图,编号从 0 到 n-1。

现给出每个点到点 0 的距离 dist0[]、每个点到点 1 的距离 dist1[],还原整张图,或判断无解。

Constraints

n 在 2 到 50 之间。

dist0 与 dist1 中的元素都在 0 到 n-1 之间。

Examples

0)

{0,2,1}

{2,0,1}

Returns: {

"NNY",

"NNY",

"YYN" }

整张图为 0 - 2 - 1。

{0,2,1}

{1,0,2}

Returns: { }

dist0[1] ≠ dist1[0]。

@solution@

根据三角形不等式,假如 u 与 v 之间有边,则 |dist0[u] - dist0[v]| ≤ 1 且 |dist1[u] - dist1[v]| ≤ 1。

如果 u, v 之间可以连边(即满足三角形不等式),则连 (u, v)。

显然边连的越多,点之间的距离越精确。

所以要是有解,则上面的连边方案一定可以得到一个合法解。

我们连完边过后再跑两边 bfs 检验一下这个图是否满足 dist0 与 dist1 的限制。

@accepted code@

#include<queue>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class DistanceZeroAndOne{
#define MAXN 50
private:
int a[MAXN][MAXN], n;
int abs(int x) {return x >= 0 ? x : -x;}
int d[MAXN];
public:
void bfs(int x) {
for(int i=0;i<n;i++)
d[i] = n;
d[x] = 0; queue<int>que; que.push(x);
while( !que.empty() ) {
int f = que.front(); que.pop();
for(int i=0;i<n;i++)
if( a[f][i] && d[f] + 1 < d[i] ) {
d[i] = d[f] + 1, que.push(i);
}
}
}
vector<string>ans;
vector<string>construct(vector<int>d0, vector<int>d1) {
ans.clear(), n = d0.size();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if( i != j && abs(d0[i] - d0[j]) <= 1 && abs(d1[i] - d1[j]) <= 1 )
a[i][j] = 1;
bool flag = true;
bfs(0);
for(int i=0;i<n;i++)
if( d[i] != d0[i] )
flag = false;
if( !flag ) return ans;
bfs(1);
for(int i=0;i<n;i++)
if( d[i] != d1[i] )
flag = false;
if( !flag ) return ans;
for(int i=0;i<n;i++) {
string s = "";
for(int j=0;j<n;j++)
if( a[i][j] ) s = s + 'Y';
else s = s + 'N';
ans.push_back(s);
}
return ans;
}
};

@details@

好像。。。也没什么细节。。。

最新文章

  1. Autodesk View and Data API二次开发学习指南
  2. JSON.stringify////////////////////////////////zzzzzzzzzzzzzz
  3. java 枚举类型 构造函数及用法
  4. 【leetcode】triangle(easy)
  5. mysql 任意连接
  6. ORACLE impdp 导入数据
  7. C# 枚举,传入int值返回string值
  8. TOMCAT 集群之 PERSISTENT SESSION
  9. centos7 更改语言
  10. 【最短路】埃雷萨拉斯寻宝(eldrethalas) 解题报告
  11. wamp出现You don’t have permission to access/on this server提示(转)
  12. codeforces 8C. Looking for Order 状压dp
  13. mysqldump 利用rr隔离实现一致性备份
  14. VS找不到MFC90d.dll错误
  15. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(二)
  16. Python flask+react+antd实现登陆demo
  17. Beta版测试报告
  18. Tqdm 进度条可视化模块
  19. SQL-40 表中新增一列
  20. 解决在linux环境安装setuptools的相关错误

热门文章

  1. 一些js面试高频知识点的总结
  2. C++/CLI 创建WinForm程序
  3. WPF 实现简单的跑马灯
  4. storm 为什么要存在不透明分区事务
  5. Lua报unexpected symbol near错误
  6. 那些年,我们见过的Java服务端乱象
  7. 第八章—BOM(一)
  8. Hdu 3887树状数组+模拟栈
  9. ecshop二次开发之单点登录
  10. GDOI2017第二轮模拟day1 总结