便 加權並查集
題目
發現每一行,列的差都相等
行
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