codeforces D. Design Tutorial: Inverse the Problem

题意:给定一个矩阵,表示每两个节点之间的权值距离,问是否可以对应生成一棵树,
使得这棵树中的任意两点之间的距离和矩阵中的对应两点的距离相等!

思路:我们将给定的矩阵看成是一个图,a 到 b会有多条路径, 如果存在一棵树,那么
这个树中a->b的距离一定是这个图中所有a->b中路径长度最短的一条!所以我们根据边权,
建立一棵MST树!再将MST树中的任意两点之间的距离求出来,看是否和矩阵中的对应的节点

对距离相同!

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
#define N 2005
#define M 2000005
using namespace std; 

int mp[N][N];
int mpp[N][N];
int f[N];
int vis[N];
int n;

struct node{
    int v, dist;
    node(){}
    node(int v, int dist){
        this->v = v;
        this->dist = dist;
    }
};

vector<node>tmp[N];

struct edge{
    int x, y, d;
    edge(int x, int y, int d){
        this->x = x;
        this->y = y;
        this->d = d;
    }
    edge(){}
};

int cnt;
edge e[M];

bool cmp(edge a, edge b){
    return a.d < b.d;
}

int getFather(int x){
    return x == f[x] ? x : f[x] = getFather(f[x]);
}

bool _union(int x, int y){
    int fx = getFather(x), fy = getFather(y);
    if( fx != fy){
        f[fx] = fy;
        return true;
    }
    return false;
}

void dfs(int u, int cur, int dist){
    vis[u] = 1;
    int len = tmp[u].size();
    for(int i = 0; i<len; ++i){
        int v = tmp[u][i].v;
        if( !vis[v] ){
            mpp[cur][v] = mpp[v][cur] = dist+tmp[u][i].dist;
            dfs(v, cur, dist+tmp[u][i].dist);
        }
    }
}

int main(){
    scanf("%d", &n);
    bool flag = true;
    bool flag1 = false;
    for(int i = 1; i <= n; ++i){
        f[i] = i;
        for(int j = 1; j <= n; ++j){
            scanf("%d", &mp[i][j]);
            if(j > i) e[cnt++] = edge(i, j, mp[i][j]);//将边存起来
            if(i==j && mp[i][j] != 0) flag = false;//是否自身到自身有权值
            if( i!=j && !mp[i][j]) flag1 = true;//是否都是全零
        }
    }
    if(!flag1 && flag){
        sort(e, e+cnt, cmp);
        for(int i=0; i<cnt; ++i)
            if( _union(e[i].x, e[i].y) )
                tmp[e[i].x].push_back(node(e[i].y, e[i].d)), tmp[e[i].y].push_back(node(e[i].x, e[i].d));

        for(int i=1; flag && i<n; ++i){//求最小生成树中任意两个节点的距离
            memset(vis, 0, sizeof(vis));
            dfs(i, i, 0);
            for(int j=i+1; flag && j<=n; ++j)
                if(!(mp[i][j] == mpp[i][j] && mp[i][j] == mp[j][i]))//如果最小生成树中的任意两点距离和给定的对应的两点之间的距离不相等
                   flag = false;
        }

        if( flag ) printf("YES\n");
        else printf("NO\n");
    }
    else printf("NO\n");
    return 0;
}
时间: 2024-09-20 15:01:36

codeforces D. Design Tutorial: Inverse the Problem的相关文章

codeforces B. Design Tutorial: Learn from Life

题意:有一个电梯,每一个人都想乘电梯到达自己想要到达的楼层!从a层到b层的时间是|a-b|, 乘客上下电梯的时间忽略不计!问最少需要多少的时间....     这是一道神题啊,自己的思路不知不觉的就按照注解的思路走了,想着用优先队列模拟一下,可能还是没有模拟好吧,一直哇!但是同学的 优先队列模拟过了! 没想到是greedy算法简单的几行就解决了! #include<iostream> #include<cmath> #include<cstdio> #include&l

codeforces C. Design Tutorial: Make It Nondeterministic

题意:每一个人 都有frist name 和 last name! 从每一个人的名字中任意选择first name 或者 last name 作为这个人的编号!通过对编号的排序,得到每一个人 最终顺序!比较中的序列能否得到给定输出的序列一致! #include<iostream> #include<cstring> #include<cstdio> #include<string> #include<map> #include<algori

codeforce A. Design Tutorial: Learn from Math

题意:将一个数拆成两个合数的和, 输出这两个数!(这道题做的真是TMD水啊)开始的时候不知道composite numbers是啥意思,看了3遍才看懂.... 看懂之后又想用素数筛选法来做,后来决定单个判断一个数是否为素数的方法来写,结果写错了两次,快疯掉了简直.... #include<iostream> #include<cmath> #include<cstdio> #include<algorithm> #include<cmath> #

PS网页设计教程XIX——在Photoshop中创建一个优雅的作品集的网页布局

作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作诗也会吟". 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试翻译这些优秀的教程.因为翻译能力有限,翻译的细节上还有待推敲,希望广大网友不吝赐教. 约定: 1.本文的软件是Photoshop CS5版本 2.原教程的截图是英文的,本人在重新制作的基础上,重新截了中文版的图 3.原文中有些操作没有给出参数.本人在反复测试的情况下测定了一些参数,以红色的

设计理论:可用性设计的10个准则

These are ten general principles for user interface design. They are called "heuristics" because they are more in the nature of rules of thumb than specific usability guidelines. Visibility of system status--系统状态的可见性 The system should always kee

在Photoshop中创建一个光质感网页设计

作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作诗也会吟". 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试翻译这些优秀的教程.因为翻译能力有限,翻译的细节上还有待推敲,希望广大网友不吝赐教. 约定: 1.本文的软件是Photoshop CS5版本 2.原教程的截图是英文的,本人在重新制作的基础上,重新截了中文版的图 3.原文中有些操作没有给出参数.本人在反复测试的情况下测定了一些参数,以红色的

精选31个网站界面设计实践教程

中介交易 SEO诊断 淘宝客 云主机 技术大厅 设计一个网站从来都不是一件容易的事.如果你去询问一位在该行业有丰富经验的网页设计师,他会告诉你以前根本没有太多关于Web设计/开发的资源.文章和各种沟通交流平台,更不用说高质量免费教程了. 本文转自:http://blog.bingo929.com/31-practical-web-interface-design-tutorials.html 如果您打算建立自己的个人网站或者重新设计您的博客的主题,现在看来已经不是很难了.这要感谢那些慷慨的设计师

PS网页设计教程XVI——在PS中创建一个摩登实验室风格的网页设计

作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作诗也会吟". 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试翻译这些优秀的教程.因为翻译能力有限,翻译的细节上还有待推敲,希望广大网友不吝赐教. 约定: 1.本文的软件是Photoshop CS5版本 2.原教程的截图是英文的,本人在重新制作的基础上,重新截了中文版的图 3.原文中有些操作没有给出参数.本人在反复测试的情况下测定了一些参数,以红色的

PS网页设计教程XV——如何在Photoshop中创建一个充满活力的作品集的网页设计

作为编码者,美工基础是偏弱的.我们可以参考一些成熟的网页PS教程,提高自身的设计能力.套用一句话,"熟读唐诗三百首,不会作诗也会吟". 本系列的教程来源于网上的PS教程,都是国外的,全英文的.本人尝试翻译这些优秀的教程.因为翻译能力有限,翻译的细节上还有待推敲,希望广大网友不吝赐教. 约定: 1.本文的软件是Photoshop CS5版本 2.原教程的截图是英文的,本人在重新制作的基础上,重新截了中文版的图 3.原文中有些操作没有给出参数.本人在反复测试的情况下测定了一些参数,以红色的