Design Tutorial: Inverse the Problem
Codeforces Round #270 D:http://codeforces.com/contest/472/problem/D
题意:给以一张图,用邻接矩阵表示,现在问你这张图能不能够是一棵树?(并且边权都是正的)
题解:看了题解才知道。如果这张图是一棵树的话,那么最小生成树一定满足条件。所以可以这样解,求一颗生成树,然后在生成树每个点DFS,求出任意两点之间的距离,看看这两点之间距离在原来的矩阵中,是否一致,如果都是一致的,则说明是可以的,否则就不行。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=;
struct Edge{
int v;
long long w;
};
vector<Edge>mp[N];
long long a[N][N];
int n,m;
struct Node{
int u,v;
long long w;
bool operator<(const Node a) const {
return w<a.w;
}
}num[N*N/];
int fa[N];
void init(){
for(int i=;i<=n;i++)
fa[i]=i;
}
int Find(int x){
int s;
for(s=x;s!=fa[s];s=fa[s]);
while(s!=x){
int temp=fa[x];
fa[x]=s;
x=temp;
}
return s;
}
void solve(){
int cnt=;
for(int i=;i<=m;i++){ int u=num[i].u;
int v=num[i].v;
// printf("***%d %d\n",u,v);
int r1=Find(u);
int r2=Find(v);
if(r1==r2)continue;
fa[r1]=r2;
cnt++;
Edge temp;
temp.v=v;temp.w=num[i].w;
mp[u].push_back(temp);
temp.v=u;
mp[v].push_back(temp);
if(cnt==n-)break;
}
}
long long ds[N];
bool visit[N];
void DFS(int u,long long w){
int tt=mp[u].size();
for(int i=;i<tt;i++){
int v=mp[u][i].v;
if(visit[v])continue;
ds[v]=w+mp[u][i].w;
visit[v]=;
DFS(v,ds[v]);
}
} bool AC(){
for(int i=;i<=n;i++){
memset(ds,-,sizeof(ds));
memset(visit,,sizeof(visit));
visit[i]=;
DFS(i,);
ds[i]=;
for(int k=;k<=n;k++){
if(ds[k]!=a[i][k])return false;
}
}
return true;
} int main(){
scanf("%d",&n);
memset(a,,sizeof(a));
init();
m=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%I64d",&a[i][j]);
bool flag=false;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j&&a[i][j]!=)flag=true;
if(i!=j&&(a[i][j]==||a[i][j]!=a[j][i]))flag=true;
if(j>i){
num[++m].u=i;num[m].v=j;num[m].w=a[i][j];
}
}
} if(!flag){
sort(num+,num+m+);
//for(int i=1;i<=m;i++)
//printf("%d %d %I64d\n",num[i].u,num[i].v,num[i].w);
solve();
if(!AC())flag=true;
}
if(flag)puts("NO\n");
else
puts("YES\n"); }
Design Tutorial: Inverse the Problem的更多相关文章
- Codeforces #270 D. Design Tutorial: Inverse the Problem
http://codeforces.com/contest/472/problem/D D. Design Tutorial: Inverse the Problem time limit per t ...
- cf472D Design Tutorial: Inverse the Problem
D. Design Tutorial: Inverse the Problem time limit per test 2 seconds memory limit per test 256 mega ...
- D. Design Tutorial: Inverse the Problem 解析含快速解法(MST、LCA、思維)
Codeforce 472D Design Tutorial: Inverse the Problem 解析含快速解法(MST.LCA.思維) 今天我們來看看CF472D 題目連結 題目 給你一個\( ...
- codeforces D. Design Tutorial: Inverse the Problem
题意:给定一个矩阵,表示每两个节点之间的权值距离,问是否可以对应生成一棵树, 使得这棵树中的任意两点之间的距离和矩阵中的对应两点的距离相等! 思路:我们将给定的矩阵看成是一个图,a 到 b会有多条路径 ...
- Codeforces Round #270 D Design Tutorial: Inverse the Problem --MST + DFS
题意:给出一个距离矩阵,问是不是一颗正确的带权树. 解法:先按找距离矩阵建一颗最小生成树,因为给出的距离都是最短的点间距离,然后再对每个点跑dfs得出应该的dis[][],再对比dis和原来的mp是否 ...
- 【CF】270D Design Tutorial: Inverse the Problem
题意异常的简单.就是给定一个邻接矩阵,让你判定是否为树.算法1:O(n^3).思路就是找到树边,原理是LCA.判断树边的数目是否为n-1.39-th个数据T了,自己测试2000跑到4s.算法2:O(n ...
- cf472C Design Tutorial: Make It Nondeterministic
C. Design Tutorial: Make It Nondeterministic time limit per test 2 seconds memory limit per test 256 ...
- cf472B Design Tutorial: Learn from Life
B. Design Tutorial: Learn from Life time limit per test 1 second memory limit per test 256 megabytes ...
- cf472A Design Tutorial: Learn from Math
A. Design Tutorial: Learn from Math time limit per test 1 second memory limit per test 256 megabytes ...
随机推荐
- 【转】Emmagee app性能测试工具使用教程
简介 Emmagee是网易杭州研究院QA团队开发的一个简单易上手的Android性能监测小工具,主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流等性能状态的变化,且用户可自定义配置监控 ...
- swift基本运算符
一.空合运算符(Nil Coalescing Operator) 形式:a??b,如果a包含值则解封,否则返回默认值b 条件:a必须为optional类型,这个就不多说了,就是可选类型:默认值b的类型 ...
- 12天学好C语言——记录我的C语言学习之路(Day 4)
12天学好C语言--记录我的C语言学习之路 Day 4: 首先来看一段程序: //输出下面4*5的矩阵 /* 1 2 3 4 5 2 4 6 8 10 3 6 9 12 ...
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
http://www.cnblogs.com/bluestorm/p/3432190.html 问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 下面代码出错的原因,在类中定义的字段为什么不 ...
- Java的基本数据类型
java的基本数据类型是四类八种: 整型 byte 1字节 8位 short 2字节 16位 int 4字节 32位 long 8字节 64位 在hibernate自动映射中会根据数字长度,选 ...
- php封装文件上传
这是一个经常在项目中遇到的问题,所以封装一个,分享给大家. 一,前期配置php.ini 如果上传文件超过了php配置那么$_POST或者$_FILES等都是空数组,这点是一个坑,因为那时候就不 ...
- 在Linux上进行QT UI开发
在QT Creator UI编辑器上通过拖拽各种控件产生UI界面,然后点击编译/Build按钮,会自动生成对应的ui_xxxx.h的 头文件/header file. 参考: 1.Linux上使用Qt ...
- ESP8266开发课堂之 - 建立一个新项目
项目架构 ESP8266项目开发并非使用IDE自动管理工程文件,而是使用了诸多第三方程序如Python,以及使用了Makefile管理依赖与控制编译,所以项目的创建与日常维护较为复杂,本篇将详述创建一 ...
- 生产者消费者问题c语言实现
#include <stdio.h> #include <process.h> #include <Windows.h> //信号量与关键段 CRITICAL_SE ...
- ubuntu12.10可用更新源
ubutnu12.10自带的更新源已经失效,国内各大服务器的更新源,无论是网易.搜狐还是教育网的因此也失效了.附件是ubuntu12.10目前的可用更新源. 将地址中的“us.archive”换成“o ...