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的更多相关文章

  1. 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 ...

  2. cf472D Design Tutorial: Inverse the Problem

    D. Design Tutorial: Inverse the Problem time limit per test 2 seconds memory limit per test 256 mega ...

  3. D. Design Tutorial: Inverse the Problem 解析含快速解法(MST、LCA、思維)

    Codeforce 472D Design Tutorial: Inverse the Problem 解析含快速解法(MST.LCA.思維) 今天我們來看看CF472D 題目連結 題目 給你一個\( ...

  4. codeforces D. Design Tutorial: Inverse the Problem

    题意:给定一个矩阵,表示每两个节点之间的权值距离,问是否可以对应生成一棵树, 使得这棵树中的任意两点之间的距离和矩阵中的对应两点的距离相等! 思路:我们将给定的矩阵看成是一个图,a 到 b会有多条路径 ...

  5. Codeforces Round #270 D Design Tutorial: Inverse the Problem --MST + DFS

    题意:给出一个距离矩阵,问是不是一颗正确的带权树. 解法:先按找距离矩阵建一颗最小生成树,因为给出的距离都是最短的点间距离,然后再对每个点跑dfs得出应该的dis[][],再对比dis和原来的mp是否 ...

  6. 【CF】270D Design Tutorial: Inverse the Problem

    题意异常的简单.就是给定一个邻接矩阵,让你判定是否为树.算法1:O(n^3).思路就是找到树边,原理是LCA.判断树边的数目是否为n-1.39-th个数据T了,自己测试2000跑到4s.算法2:O(n ...

  7. cf472C Design Tutorial: Make It Nondeterministic

    C. Design Tutorial: Make It Nondeterministic time limit per test 2 seconds memory limit per test 256 ...

  8. cf472B Design Tutorial: Learn from Life

    B. Design Tutorial: Learn from Life time limit per test 1 second memory limit per test 256 megabytes ...

  9. cf472A Design Tutorial: Learn from Math

    A. Design Tutorial: Learn from Math time limit per test 1 second memory limit per test 256 megabytes ...

随机推荐

  1. .Net 动态代理,AOP

    .Net 动态代理,AOP 直接上代码了. /***************************************** * author:jinshuai * * E-mail:redfox ...

  2. php的递归函数

    递归函数,就是在函数体内调用自身 例子: <?php function repayment($number){  if ($number<10){   echo $number." ...

  3. shell中if判断一个变量为空

    1.最直接简单的判断 [ ! $a ] && echo "a is null" 不用那些if语句了,直接缩短代码量. 2. 变量通过" "引号引 ...

  4. Linux系统各发行版镜像下载(2)

    Fedora ISO镜像下载: Fedora 是一个开放的.创新的.前瞻性的操作系统和平台,基于 Linux.它允许任何人自由地使用.修改和重发布,无论现在还是将来.它由一个强大的社群开发,这个社群的 ...

  5. ### 学习《C++ Primer》- 6

    Part 6: 拷贝控制(第13章) // @author: gr // @date: 2015-01-08 // @email: forgerui@gmail.com 一.拷贝.赋值与销毁 拷贝构造 ...

  6. RTTI(Runtime Type Information )

    RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法.本文将简略介绍 RTTI 的一些背景知识.描述 RTTI 的概念,并通 ...

  7. 暑假集训(2)第六弹 ----- Frosh Week(UVA11858)

    H - Frosh Week Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     ...

  8. shell环境

    1 引言 一个进程运行在shell环境中,理解进程运行的环境是十分重要的.环境影响着进程的行为,利用环境提供的便利,可以极大地提高开发效率.本节深入讨论shell中与进程有关的环境问题,包括命令行参数 ...

  9. Android开发系列之AChartEngine

    Android图表控件的开发 曾经开发过一个小程序,在Android电视机上面开发一个APP,用于显示一些统计图表的信息.最后找来找去基于Android Native开发有AChartEngine现成 ...

  10. AngularJS(4)-服务(Service)

    1.$location服务 $location 服务,它可以返回当前页面的 URL 地址 2.$http服务 $http 是 AngularJS 应用中最常用的服务. 服务向服务器发送请求,应用响应服 ...