日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

How Many Answers Are Wrong HDU - 3038(带权并查集经典题,满满的都是注释)

發(fā)布時(shí)間:2025/4/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 How Many Answers Are Wrong HDU - 3038(带权并查集经典题,满满的都是注释) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

How Many Answers Are Wrong HDU - 3038? 點(diǎn)擊打開鏈接 題意:現(xiàn)在有n個(gè)數(shù)(你并不知道這n個(gè)數(shù)是什么),m次查詢,每次查詢給出u,v,w。表示從第u個(gè)數(shù)到第v個(gè)數(shù)的和為w。 問,在這些查詢中,有多少個(gè)是錯(cuò)誤的(即有沖突)。 思路:從第u個(gè)數(shù)到第v個(gè)數(shù)的和其實(shí)可以理解為,第u-1個(gè)數(shù)到v個(gè)數(shù)之間的和。那么,就可以把和當(dāng)成一種關(guān)系,利用帶權(quán)并查集來維護(hù)這種關(guān)系。u-1節(jié)點(diǎn)為根,v的權(quán)值為第u-1個(gè)數(shù)到v個(gè)數(shù)之間的和。這里需要理解一下的是,在Find函數(shù)和unite(合并)函數(shù)里面,有兩個(gè)關(guān)系域的轉(zhuǎn)移方程(暫且這么叫他吧) ①p[x].relation+=p[tmp].relation ②p[root2].relation=p[x].relation+relation-p[y].relation 這兩個(gè)方程需要自己帶入一兩個(gè)例子才能推得出來,所以不要憐惜你的紙和筆!!!一定要自己推一下 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 using namespace std; 6 const int Max=200005; 7 typedef struct node//par表示父親節(jié)點(diǎn),relation表示關(guān)系,即權(quán)值 8 { 9 int par,relation; 10 }node; 11 node p[Max]; 12 int n,m,ans; 13 void init()//初始化,父親為自己,自己到自己的距離為0 14 { 15 ans=0; 16 for(int i=1;i<=n;i++){ 17 p[i].par=i; 18 p[i].relation=0; 19 } 20 } 21 int Find(int x)//路徑壓縮 22 { 23 if(x==p[x].par) 24 return x; 25 int tmp=p[x].par; 26 p[x].par=Find(tmp); 27 p[x].relation+=p[tmp].relation;//關(guān)系域的轉(zhuǎn)移方程一 28 return p[x].par; 29 } 30 void unite(int x,int y,int relation) 31 { 32 int root1=Find(x); 33 int root2=Find(y); 34 if(root1!=root2){//如果根不相同,那么,把root2連到root1上即合并操作 35 p[root2].par=root1; 36 p[root2].relation=p[x].relation+relation-p[y].relation;//關(guān)系域的轉(zhuǎn)移方程二 37 } 38 else{//如果根相同,則不用合并,那么進(jìn)行判斷,看給出的區(qū)間的和是否有沖突,有的話ans++ 39 if(p[y].relation-p[x].relation!=relation) 40 ans++; 41 } 42 } 43 int main() 44 { 45 while(~scanf("%d%d",&n,&m)){ 46 int u,v,w; 47 init(); 48 for(int i=0;i<m;i++){ 49 scanf("%d%d%d",&u,&v,&w); 50 u-=1;//從第u個(gè)數(shù)到第v個(gè)數(shù)的和理解為,第u-1個(gè)數(shù)到v個(gè)數(shù)之間的和 51 unite(u,v,w); 52 } 53 printf("%d\n",ans); 54 } 55 return 0; 56 } View Code

?

?


?

轉(zhuǎn)載于:https://www.cnblogs.com/Levi-0514/p/9042485.html

總結(jié)

以上是生活随笔為你收集整理的How Many Answers Are Wrong HDU - 3038(带权并查集经典题,满满的都是注释)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。