题意异常的简单。就是给定一个邻接矩阵,让你判定是否为树。
算法1:O(n^3)。思路就是找到树边,原理是LCA。判断树边的数目是否为n-1。39-th个数据T了,自己测试2000跑到4s。
算法2:O(n^2)。思考由图如何得到树,显然MST是可行的。因此,题目变为直接找到MST。然后通过树边构建目标矩阵。判定矩阵是否相等。

 /* 472D */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int maxn = ;
const int INF = 0x3f3f3f3f;
int M[maxn][maxn];
int T[maxn][maxn];
int dist[maxn];
int fa[maxn];
bool visit[maxn];
int n; void kruskal() {
memset(visit, false, sizeof(visit));
memset(dist, 0x3f, sizeof(dist));
int v, mn;
int i, j, k; dist[] = ;
for (i=; i<n; ++i) {
mn = INF;
for (j=; j<n; ++j) {
if (!visit[j] && dist[j]<mn) {
mn = dist[j];
v = j;
}
} assert(mn < INF); for (j=; j<n; ++j) {
if (visit[j]) {
T[j][v] = T[v][j] = T[j][fa[v]] + mn;
}
}
visit[v] = true; for (j=; j<n; ++j) {
if (M[v][j] < dist[j]) {
dist[j] = M[v][j];
fa[j] = v;
}
}
}
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif bool flag = true; scanf("%d", &n); rep(i, , n)
rep(j, , n)
scanf("%d", &M[i][j]); rep(i, , n) {
if (M[i][i] != ) {
flag = false;
goto _output;
}
rep(j, i+, n) {
if (M[i][j]!=M[j][i] || M[i][j]==) {
flag = false;
goto _output;
}
}
} kruskal(); rep(i, , n) {
rep(j, i+, n) {
if (M[i][j] != T[i][j]) {
flag = false;
goto _output;
}
}
} _output:
puts(flag ? "YES":"NO"); #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

最新文章

  1. 原生JS封装Ajax插件(同域&amp;&amp;jsonp跨域)
  2. php 实现设计模式之 建造者模式
  3. c++继承,多态,重载的作用
  4. win10添加打印机--无法访问指定设备,路径或文件。。
  5. Linux多线程之同步2 &mdash;&mdash; 生产者消费者模型
  6. 4. 2D绘制与控件绘制
  7. 《使用wxWidgets进行跨平台程序开发》chap02——一个简单的应用程序
  8. Struts2+Ajax实现检测用户名是否唯一
  9. [LeetCode]题解(python):022-Generate Parentheses
  10. Do not wait until the conditions are perfect to begin. Beginning makes the conditions perfect(转)
  11. HDU 2460 Network(双连通+树链剖分+线段树)
  12. z-index失效的原因
  13. CentOS6.7 防火墙规则(Iptables)
  14. APP应用测试技巧
  15. 201521123105 第9周Java学习总结
  16. ZOJ1315
  17. Linq to Object原理
  18. 什么是CLOS架构?
  19. web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开
  20. iOS开发 -------- storyBoard实现控制器添加childViewController

热门文章

  1. Kali Linux 2.0: 安装之后的操作
  2. CentOS&amp;nbsp;6.4&amp;nbsp;图文安装教…
  3. artTemplate模板引擎的源码拜读
  4. angularJs ionic phoneGap 分享
  5. CI 笔记 easyui 结合后,左侧导航跳转问题
  6. SQL,学习基础2
  7. 防止sql注入式攻击 SQL注入学习——三层架构
  8. 生产者与消费者(二)---await与 signal
  9. 为什么喜欢Kindle
  10. MATLAB中的函数的归总