• Codeforces 472(#270 ) D Design Tutorial: Inverse the Problem


    题意:给你一棵数的距离矩阵,问你这个矩阵是否合法

    解题思路:利用树的性质进行prime 和连边,产生最小生成树,最后看最小生成树是否和给出的一致就行

    解题代码:

      1 // File Name: d.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年09月29日 星期一 00时45分45秒
      4 
      5 #include<vector>
      6 #include<list>
      7 #include<map>
      8 #include<set>
      9 #include<deque>
     10 #include<stack>
     11 #include<bitset>
     12 #include<algorithm>
     13 #include<functional>
     14 #include<numeric>
     15 #include<utility>
     16 #include<sstream>
     17 #include<iostream>
     18 #include<iomanip>
     19 #include<cstdio>
     20 #include<cmath>
     21 #include<cstdlib>
     22 #include<cstring>
     23 #include<ctime>
     24 #define LL long long
     25 #define maxn 2010
     26 using namespace std;
     27 int n ; 
     28 int mi[maxn];
     29 vector <int> mp[2010];
     30 int nmp[maxn][maxn];
     31 int pre[maxn];
     32 bool vis[maxn];
     33 
     34 long long  dep[maxn];
     35 void dfs(int la,int zla,int dis)
     36 {
     37    dep[la] = dis;   
     38    int len = mp[la].size();
     39    for(int i = 0 ;i < len ;i ++)
     40    {
     41        int ne = mp[la][i];
     42        if(ne != zla)
     43        {
     44           dfs(ne,la,dis + nmp[la][ne]);
     45        }
     46    }
     47 }
     48 void prime()
     49 {
     50     for(int i = 1;i <= n;i ++){
     51        dep[i] = 2e9;
     52        vis[i] = 0 ; 
     53     }        
     54     dep[1] = 0 ; 
     55     while(1)
     56     {
     57        int v = -1;
     58        for(int i = 1;i <= n;i ++)
     59        {
     60           if(!vis[i] && (v == -1 || dep[i] < dep[v]))
     61               v = i ;  
     62        }
     63        if(v == -1)
     64            break;
     65        vis[v] = 1;
     66        for(int i = 1;i <= n;i ++)
     67        {
     68            if(!vis[i] && nmp[v][i] < dep[i]) 
     69            {
     70               dep[i] = nmp[pre[i] = v][i];
     71            }
     72        }
     73     }
     74 }
     75 int main(){
     76      scanf("%d",&n);
     77      int sum = 0 ; 
     78      int ok  = 0 ;
     79      for(int i = 1;i <= n;i ++)
     80      { 
     81         for(int j = 1;j <= n;j ++)
     82         {
     83             scanf("%d",&nmp[i][j]);
     84         }
     85      }
     86      for(int i = 1;i <= n;i ++)
     87      {
     88         for(int j = 1;j <= n;j ++)
     89         {
     90            if(i!= j && nmp[i][j] == 0 )
     91                ok = 1;
     92            if(nmp[i][j] != nmp[j][i])
     93                ok = 1;
     94         }
     95      }
     96      if(ok)
     97      {
     98        puts("NO");
     99        return 0 ; 
    100      }
    101      prime();
    102      for(int i = 2;i <= n;i ++)
    103      {
    104        mp[i].push_back(pre[i]);
    105        mp[pre[i]].push_back(i);
    106        //printf("%d %d
    ",i,pre[i]);
    107      }
    108      for(int i = 1;i <= n;i ++)
    109      {
    110         dfs(i,0,0);
    111     /*    for(int j = 1;j <= n;j ++)
    112             printf("%lld ",dep[j]);
    113         printf("
    ");*/
    114         for(int j = 1; j <= n;j ++)
    115         {
    116            if(dep[j] != nmp[i][j])
    117            {
    118               
    119               puts("NO");
    120               return 0;
    121            }
    122         }
    123      }
    124      puts("YES");
    125 return 0;
    126 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    周总结5
    《梦段代码》阅读笔记01
    NABCD
    结对开发(四则运算)
    《人月神话》阅读笔记03
    周总结4
    移动端疫情显示
    周总结3
    《人月神话》阅读笔记02
    软件工程第四周作业
  • 原文地址:https://www.cnblogs.com/zyue/p/4004549.html
Copyright © 2020-2023  润新知