1. 程式人生 > >便 加權並查集

便 加權並查集

題目
發現每一行,列的差都相等
124235346

1-2=2-3=3-4
2-4=3-5=4-6

1-2=2-3=4-5
2-3=3-4=5-6
再發現了這個神奇的規律後,就可以用帶權並查集維護了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define N 100005
using namespace std;
int T,n,m,num,fx[N],fy[N],wx[N],wy[N],min1[N],min2[N];
bool
flag; struct data{int x,y,val;}d[N]; bool cmpx(data a,data b){return a.x<b.x;} bool cmpy(data a,data b){return a.y<b.y;} int findx(int x){ if(x==fx[x])return x; int rt=findx(fx[x]); wx[x]+=wx[fx[x]]; return fx[x]=rt; } bool addx(int a,int b,int w){ if(findx(a)!=findx(b)){ int
fa=findx(a),fb=findx(b); fx[fa]=fb; wx[fa]=wx[b]+w-wx[a]; return true; } else return wx[a]==wx[b]+w; } int findy(int x){ if(x==fy[x])return x; int rt=findy(fy[x]); wy[x]+=wy[fy[x]]; return fy[x]=rt; } bool addy(int a,int b,int w){ if(findy(a)!=findy(b)){ int
fa=findy(a),fb=findy(b); fy[fa]=fb; wy[fa]=wy[b]+w-wy[a]; return true; } else return wy[a]==wy[b]+w; } void pno(){printf("No\n");} int main() { scanf("%d",&T); while(T--){ flag=0; scanf("%d%d%d",&n,&m,&num); for(int i=1;i<=n;i++){fx[i]=i;wx[i]=0;} for(int i=1;i<=m;i++){fy[i]=i;wy[i]=0;} for(int i=1;i<=num;i++){ scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].val); if(d[i].val<0) flag=1; } if(flag==1){pno();continue;} sort(d+1,d+num+1,cmpx); for(int i=1;i<num;i++) if(d[i].x==d[i+1].x) if(!addy(d[i].y,d[i+1].y,d[i].val-d[i+1].val)) flag=1; if(flag==1){pno();continue;} sort(d+1,d+num+1,cmpy); for(int i=1;i<num;i++) if(d[i].y==d[i+1].y) if(!addx(d[i].x,d[i+1].x,d[i].val-d[i+1].val)) flag=1; if(flag==1){pno();continue;} memset(min1,0x7f,sizeof min1); memset(min2,0x7f,sizeof min2); for(int i=1;i<=num;i++){ int rt=findx(d[i].x); min1[rt]=min(min1[rt],d[i].val-wx[d[i].x]); } for(int i=1;i<=n;i++){ int rt=findx(i); min2[rt]=min(min2[rt],wx[i]); } for(int i=1;i<=n;i++) if(fx[i]==i&&min1[i]+min2[i]<0) flag=1; if(flag==1){pno();continue;} printf("Yes\n"); } return 0; }

相關推薦

便 加權

題目 發現每一行,列的差都相等 ⎡⎣⎢124235346⎤⎦⎥ 行 1-2=2-3=3-4 2-4=3-5=4-6 列 1-2=2-3=4-5 2-3=3-4=5-6 再發現了這個神奇的規律後,就可以用帶權並查集維護了。 #include

HDU 3407.Zjnu Stadium 加權

log left main number mes people spl b- display Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/

加權

void print 食物鏈 lag 遍歷 並查集 read 否則 忽略 加權並查集是一種特殊的並查集,除可提供查詢操作外,還可用於表示元素與其代表元素的關系。下面以食物鏈為例,講解一下加權並查集。 #include<cstdio> //調用cstdi

【TOJ 3955】NKU ACM足球賽(加權

namespace 如果 main 加權並查集 幫助 iostream sof 報名人數 -- 描述 NKU ACM最近要舉行足球賽,作為此次賽事的負責人,Lee要對報名人員進行分隊。分隊要遵循如下原則: 一個人不能加入多支隊伍;不認識的人不能分在同一隊;如果a和b認識,

HDU3038(KB5-D加權)

script accep training out friends save esp != elf How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327

Cube Stacking P0J 1988(加權

ati initial mil ide art else display ans size Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)id

POJ 1733 Parity game(加權

題意:這是一個01的串,然後有m個類似於詢問的東西,每次詢問都告訴你這個區間的和為奇數還是偶數,讓你判斷正確的有幾句,如果不正確,直接跳出 思路:和華中科技大學的決賽差不多,我們將奇數設為1,偶數為0,那我們可以發現他們的奇偶性可以用異或代替,然後就穿一樣了,加上判斷條件就OK了,記得離散化 程式碼:

A Bug's Life(加權

Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two di

A Bug's Life(加權

滴答滴答---題目連結  A Bug's Life(加權並查集) Description Background  Professor Hopper is researching the sexual behavior of a rare species of bugs

A Bug's Life(加權

Description Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature t

資料結構與演算法 --- 帶路徑壓縮的加權演算法

#include <iostream> using namespace std; class UF { private: int N; // 節點數 int count; // 連通分支數 int *id; // 儲存節點

[BZOJ4602][Sdoi2016]齒輪(加權

=== === 這裡放傳送門 === === 題解 作為SDOI R2的題這題已經很良心了。。。然而ATP當時仍然寫掛了。。不是很懂自己為什麼這麼辣雞(╯‵□′)╯︵┻━┻ 首先可以看出這個齒輪的轉動關係是具有傳遞性的,如果知道x和y的關係,也知道

hdu 2545 樹上戰爭(加權

題意:給出一顆樹,每次詢問樹上兩個節點到根的距離誰更近。。 #include <iostream> #include <cstdio> #include <cstring

POJ 1182 食物鏈 加權

Description 動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。 現有N個動物,以1-N編號。每個動物都是A,B,C中的一種

加權詳解

加權並查集,就是普通的並查集加了個權值。以題目來舉例吧。 題意:給你m個區間的區間端點及區間和,一個個的讀入這些區間,問有多少個區間與前面的區間衝突。 分析:將區間端點看成是一個節點,用一個parent[i]陣列表示結點i指向的父節點,用一個sum[i]陣列表示結點i

重量差異 (加權

重量差異 10.11 思路: 加權並查集的經典應用。每個點儲存它與根節點的重量差,合併與路徑壓縮時維護一下就好。 離線的按秩合併可能會T掉。。。 #include <cstdio>

hdu 3234 異或(加權

 有n(n<=20000)個未知的整數X0,X1,X2Xn-1,有以下Q個(Q<=40000)操作:   I p v :告訴你Xp=v   I p q v :告訴你Xp Xor Xq=v   Q k p1 p2 … pk : 詢問 Xp1 Xor Xp2 .

POJ-1988 Cube Stacking (加權

題目大意: 給你編號從1到30000的大小相同的立方體,現在我有2種操作: 1.move 1,3表示把1放在3的上面。 還有一種情況是:假如1的下面還有一個2,3的下面還有一個4,那麼move1,3的意思就是把1所在的全部立方體放在3全部立方體的上面,而且保持原來1和3所

la4487 加權,異或的性質

兩個數異或是一個值,這個時候只要再有任意一個數,兩個數就都可以知道了 而如果知道了a和b的異或,a和c的異或,顯然就可以知道b和c的異或 對於這題首先我的思路: 我的思路特別麻煩……因為受到了以前做並查集一題的影響:每個數的每一位都存起來,把它與它的反都存一遍,並查集維護

poj2492(加權值的

Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature t