codeforces D. Design Tutorial: Inverse the Problem

題意:給定一個矩陣,表示每兩個節點之間的權值距離,問是否可以對應生成一棵樹,
使得這棵樹中的任意兩點之間的距離和矩陣中的對應兩點的距離相等!

思路:我們將給定的矩陣看成是一個圖,a 到 b會有多條路徑, 如果存在一棵樹,那么
這個樹中a->b的距離一定是這個圖中所有a->b中路徑長度最短的一條!所以我們根據邊權,
建立一棵MST樹!再將MST樹中的任意兩點之間的距離求出來,看是否和矩陣中的對應的節點
對距離相同!

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<vector>
  5 #include<algorithm>
  6 #define N 2005
  7 #define M 2000005
  8 using namespace std; 
  9 
 10 int mp[N][N];
 11 int mpp[N][N];
 12 int f[N];
 13 int vis[N];
 14 int n;
 15 
 16 struct node{
 17     int v, dist;
 18     node(){}
 19     node(int v, int dist){
 20         this->v = v;
 21         this->dist = dist;
 22     }
 23 };
 24 
 25 vector<node>tmp[N];
 26 
 27 struct edge{
 28     int x, y, d;
 29     edge(int x, int y, int d){
 30         this->x = x;
 31         this->y = y;
 32         this->d = d;
 33     }
 34     edge(){}
 35 };
 36 
 37 int cnt;
 38 edge e[M];
 39 
 40 bool cmp(edge a, edge b){
 41     return a.d < b.d;
 42 }
 43 
 44 int getFather(int x){
 45     return x == f[x] ? x : f[x] = getFather(f[x]);
 46 }
 47 
 48 bool _union(int x, int y){
 49     int fx = getFather(x), fy = getFather(y);
 50     if( fx != fy){
 51         f[fx] = fy;
 52         return true;
 53     }
 54     return false;
 55 }
 56 
 57 void dfs(int u, int cur, int dist){
 58     vis[u] = 1;
 59     int len = tmp[u].size();
 60     for(int i = 0; i<len; ++i){
 61         int v = tmp[u][i].v;
 62         if( !vis[v] ){
 63             mpp[cur][v] = mpp[v][cur] = dist+tmp[u][i].dist;
 64             dfs(v, cur, dist+tmp[u][i].dist);
 65         }
 66     }
 67 }
 68 
 69 int main(){
 70     scanf("%d", &n);
 71     bool flag = true;
 72     bool flag1 = false;    
 73     for(int i = 1; i <= n; ++i){
 74         f[i] = i;
 75         for(int j = 1; j <= n; ++j){
 76             scanf("%d", &mp[i][j]);
 77             if(j > i) e[cnt++] = edge(i, j, mp[i][j]);//將邊存起來 
 78             if(i==j && mp[i][j] != 0) flag = false;//是否自身到自身有權值 
 79             if( i!=j && !mp[i][j]) flag1 = true;//是否都是全零 
 80         }
 81     }
 82     if(!flag1 && flag){
 83         sort(e, e+cnt, cmp);
 84         for(int i=0; i<cnt; ++i)
 85             if( _union(e[i].x, e[i].y) )
 86                 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));
 87        
 88         for(int i=1; flag && i<n; ++i){//求最小生成樹中任意兩個節點的距離 
 89             memset(vis, 0, sizeof(vis));
 90             dfs(i, i, 0);
 91             for(int j=i+1; flag && j<=n; ++j)
 92                 if(!(mp[i][j] == mpp[i][j] && mp[i][j] == mp[j][i]))//如果最小生成樹中的任意兩點距離和給定的對應的兩點之間的距離不相等 
 93                    flag = false;
 94         }
 95          
 96         if( flag ) printf("YES\n");
 97         else printf("NO\n");
 98     }
 99     else printf("NO\n");
100     return 0;
101 } 
View Code

?

轉載于:https://www.cnblogs.com/hujunzheng/p/4001152.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531622.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux ssh 遠程會話保存,遠程SSH會話和流程在斷開后運行的5種方法

SSH或安全Shell簡單來說就是一個人可以遠程訪問其他用戶的其他系統&#xff0c;但僅在命令行即非GUI模式的方法。 在更多的技術術語中&#xff0c;當我們ssh到其他用戶在某些其他系統上并在該機器上運行命令時&#xff0c;它實際上創建一個偽終端并將其附加到登錄用戶的登錄she…

java模擬一個簡單的QQ

v 項目源碼https://github.com/hjzgg/java_QQ v 標題效果package testFour;import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.I…

修改Linux啟動后的默認顏色,更改linux目錄的默認顏色(我選擇了Yellow)

在控制臺下&#xff0c;用ls&#xff0c;就會發現&#xff0c;shell將不同類型的文件項目顯示為不同的顏色。者可以提高效率&#xff0c;不用ls -l便能大概的把各個文件的類型情況了解一下。你有沒有想過更改這個著色配置呢&#xff1f;其 實&#xff0c;在/etc下有一個DIR_COL…

AC_Dream 1216 G - Beautiful People

題意&#xff1a;有n個人每人有一個力氣值Si,美麗值Bi&#xff0c;滿足Bi>Bj&&Si>Sj 或者 Bi<Bj&&Si<Sj 的人可以一起參見晚會&#xff0c;問最多有多少人可以一起參見晚會。思路&#xff1a; 我們根據S從小到大將所有人排序&#xff0c;然后看B最…

云主機用linux還是winows,云服務器一般使用什么系統?Linux還是Windows?

云服務器一般使用什么系統?最常用的就是Linux以及Windows系統&#xff0c;兩大系統各有不同優勢&#xff0c;大家選擇上也是存在差異的&#xff0c;接下來跟著小編來了解一下吧。Windows系統&#xff1a;一般情況來說&#xff0c;Windows系統常用的是Server 2003和Server 2008…

c語言程序中return的作用,單片機C語言程序中return dat 什么意思

/* 打開 ISP,IAP 功能 */void ISP_IAP_enable(void){EA 0; /* 關中斷 */ISP_CONTR ISP_CONTR & 0x18; /* 0001,1000 */ISP_CONTR ISP_CONTR | WaitTime; /* 寫入硬件延時 */ISP_CONTR ISP_CONTR | 0x80; /* ISPEN1 */}/* 關閉 ISP,IAP 功能 *…

java中DatagramSocket連續發送多個數據報包時產生丟包現象解決方案

1 try {2 //向指定的ip和端口發送數據~&#xff01;3 //先說明一下數據是誰發送過來的&#xff01;4 byte[] ip InetAddress.getLocalHost().getHostAddress().getBytes();5 …

二級c語言程序設計bug,《C語言及程序設計》實踐項目——發現Bug

返回&#xff1a;賀老師課程教學鏈接【項目1-sin泰勒展式中的錯誤】下面是sin函數的泰勒展式&#xff1a;(注&#xff1a;x取弧度值&#xff0c;而非角度值)編寫了double mysin(double x)用于求sin值&#xff0c;卻“死”在了123上。劇透一下&#xff0c;循環沒有問題(當然問題…

AC_Dream 1224 Robbers(貪心)

題意&#xff1a;n個搶劫犯分別搶到的金錢是k1, k2, k3,...&#xff0c;一共得到的金錢是m&#xff0c; 但是在分錢的時候是按照x1/y, x2/y, x3/y,....的比例進行分配的&#xff01;這樣的話 一些搶劫犯就會覺得不公平&#xff0c;不公平度為|xi/y - ki/m|(浮點運算)&#xff0…

C語言編程出圖形,C語言畫出各種圖形

矩形&#xff1a;(里面是空的)******** ** ** ********Program ended with exit code: 0for (int i 0; i < 5; i ) {for (int j 0; j < 7; j ) {//用條件判斷打出*號if (i 0 || i 4 || j 0 || j 6 ) {printf("*");}else{printf(" "…

AC_Dream 1211 Reactor Cooling

1 /*2 題意&#xff1a;無源無匯&#xff0c;并且每條邊的容量有上下界限的網絡流問題&#xff01;既然無源無匯&#xff0c;那么素有的節點都應該滿足“入流出流”&#xff01;3 輸出每一條邊的流量&#xff0c;使得滿足上面的條件。&#xff08;如果u->v有流…

c語言中const對于define優點,為什么大多數C開發人員使用define而不是const?

這有一個非常可靠的原因&#xff1a;C中的const并不意味著一些常量。 這只是意味著一個variables是只讀的。在編譯器需要一個常量的地方(例如非VLA數組的數組大小)&#xff0c;使用constvariables(如fieldWidth是不可能的。他們不一樣const只是一個限定符&#xff0c;它表示一個…

c語言程序設計期末試卷A,《C語言程序設計》期末試卷(A)..doc

《C語言程序設計》期末試卷(A).2011-12-1學期《C語言程序設計》期末試卷(A)班級____________姓名____________學號________________大題號一二三四總分得 分判卷 /核分人“一、選擇題”使用答題卡選擇。“二、看程序寫運行結果”答題處&#xff1a;題號答 案二、1二、2二、3“三…

codeforces B. Strongly Connected City(dfs水過)

題意&#xff1a;有橫向和縱向的街道&#xff0c;每個街道只有一個方向&#xff0c;垂直的街道相交會產生一個節點&#xff0c;這樣每個節點都有兩個方向&#xff0c; 問是否每一個節點都可以由其他的節點到達.... 思路&#xff1a;規律沒有想到&#xff0c;直接爆搜&#xff0…

c語言數組兩個值交換,如可交換兩個數組中的元素?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include #include #include int main(void){int a[]{1,2,3,4,5,6,7,8};int b[]{9,10,11,12,13,15};int lena,lenb,randa,randb,randtimes;int i,temp;srand((unsigned)time(NULL));lena sizeof(a)/sizeof(int);lenb sizeof(b)/s…

Uvaoj 11248 Frequency Hopping(Dinic求最小割)

題意&#xff1a;1到n節點&#xff08;節點之間有一定的容量&#xff09;&#xff0c;需要流過C的流量&#xff0c;問是否可以&#xff1f;如果可以輸出possible&#xff0c; 否則如果可以擴大任意一條邊的容量 可以達到目的&#xff0c;那么輸出possible option&#xff1a;接…

隨機數歸并排序c語言,用C語言實現歸并排序

#include#include#include#include#define random(i) (rand()%i)#define N 12#define INFINITY 99999999//要排序的數存放在a數組匯總&#xff0c;p,q,r是數組下標void Merge(int *a,int p,int q,int r){int n1q-p1;int n2r-q;int *L(int *)malloc(sizeof(int)*n1);int *R(int …

UVAoj 11324 - The Largest Clique(tarjan + dp)

題意&#xff1a;給定一個有向圖&#xff0c;尋找一個點數最大集合&#xff0c;使得這個集合中的任意兩個點 u,v, 都有u->v 或者 v->u 或者u<>v 思路&#xff1a;首先將強連通分量通過tarjan算法求出來&#xff0c;然后進行縮點&#xff0c;也就是每一個縮點 所組成…

android開發藍牙自動連接電腦上,Android藍牙開發之自動連接設備

自動連接使用的是SharedPreferences這個來解決。private void Automaticconnection() {SharedPreferences sp getSharedPreferences("Dizhi", MODE_PRIVATE);String address sp.getString("address", "");if (!address.equals("")) …

hdu 2014鞍山賽區 5073 Galaxy

題意&#xff1a;就是給你 n 個數&#xff0c;代表n個星球的位置&#xff0c;每一個星球的重量都為 1 &#xff01; 開始的時候每一個星球都繞著質心轉動&#xff0c;那么質心的位置就是所有的星球的位置之和 / 星球的個數 現在讓你移動 k 個星球到任意位置&#xff08;多個星球…