1. 程式人生 > >Poj 1182 食物鏈 (並查集

Poj 1182 食物鏈 (並查集

食物鏈

Time Limit: 1000MSMemory Limit: 10000K
Total Submissions: 67954Accepted: 20088

Description

動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。
現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們並不知道它到底是哪一種。
有人用兩種說法對這N個動物所構成的食物鏈關係進行描述:
第一種說法是”1 X Y”,表示X和Y是同類。
第二種說法是”2 X Y”,表示X吃Y。
此人對N個動物,用上述兩種說法,一句接一句地說出K句話,這K句話有的是真的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。
1) 當前的話與前面的某些真的話衝突,就是假話;
2) 當前的話中X或Y比N大,就是假話;
3) 當前的話表示X吃X,就是假話。
你的任務是根據給定的N(1 <= N <= 50,000)和K句話(0 <= K <= 100,000),輸出假話的總數。

Input

第一行是兩個整數N和K,以一個空格分隔。
以下K行每行是三個正整數 D,X,Y,兩數之間用一個空格隔開,其中D表示說法的種類。
若D=1,則表示X和Y是同類。
若D=2,則表示X吃Y。

Output

只有一個整數,表示假話的數目。

Sample Input

100 7
1 101 1 
2 1 2
2 2 3 
2 3 3 
1 1 3 
2 3 1 
1 5 5

Sample Output

3
帶權並查集_很難
#include<cstdio>
#define N 50005

int pre[N], relation[N];

void init(int n)
{
    for
(int i = 0;i <= n; i++) { pre[i] = i; relation[i] = 0; } } /*更新的同步,先將當前根節點與其根節點相連,然後更新其與根節點的關係 當前節點x與其根節點r的更新方法為: (x與其父節點的關係+父節點與根節點的關係)%3 更新x節點的資料之前需要更新其父節點的資料 更新的順序為 :從根節點向下直到更新到當前節點x的父節點 */ int find(int x) { if(pre[x] == x) { //x直接就是根節點 return x; } else
{ int temp = pre[x]; //將當前節點的父節點更新為根節點 pre[x] = find(temp); //更新當前節點與根節點的關係,由X→X父節點,X父節點→根節點 //更新為X→X父根節點, 所以在此之前必須更新X父節點與根節點的關係 relation[x] = (relation[x]+ relation[temp]) % 3; return pre[x]; } } int main() { int n, m, x, y, fx, fy, d, ans; scanf("%d%d",&n,&m); ans = 0; init(n); for(int i = 0;i < m; i++) { scanf("%d%d%d",&d,&x,&y); if(x>n || y>n) { ans++; continue; } if(d==2 && x==y) { ans++; continue; } fx = find(x); fy = find(y); if(fx == fy) { // 屬於同一個子集 //如果x,y同類那麼它們對應的根節點應該一樣 if(d==1 && relation[x]!=relation[y]) { ans++; } //如果不是同類,加入X與Y的關係後,X相對與根節點的關係(X根→Y,Y→X(即3-(d-1)=2)即X根→X)應該是不變的 // d = 2表示x-y=1,而y→x=3- (x→y)=2 if(d==2 && relation[x]!=(relation[y]+2)%3) { ans++; } } else { //合併兩個聯通區域 pre[fy] = fx; // y父的根節點更新為x的根 //(d-1)為X與Y的關係,3-relation[y] 是y與y的根節點關係,relation[x]是其根節點與X的關係 //X根 →X,X →Y根,即X根→Y根 relation[fy] = (relation[x]+(d-1)+(3-relation[y])) % 3; } } printf("%d\n",ans); return 0; }

相關推薦

poj-1182-食物鏈(

題目地址 http://poj.org/problem?id=1182 解題思路 對於每隻動物i創造三個元素i-A, i-B, i-C, 並用這3*N個元素建立並查集。 i-x表示“i屬於種類x” 並查集裡的每一組內所有元素代表的情況都同

Poj 1182 食物鏈 (

食物鏈 Time Limit: 1000MSMemory Limit: 10000KTotal Submissions: 67954Accepted: 20088Description動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B,

poj 1182 食物鏈()

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

POJ 1182 食物鏈(

動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。 現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們並不知道它到底是哪一種。 有人用

POJ 1182 食物鏈 +偏移向量

引言: 一般的並查集都是把同一類的點放在一棵樹上。但是這道題給出的是一些點的相對關係,就不能按照這樣的規則建樹了。應該把能夠確定相對關係的點放到一棵樹上。每個節點除了自身的值之外,還應該有一個域,或者說是偏移量,它表示的是這個點和其父節點之間的關係。所以當我們要改變一個節點

POJ - 1182(種類)

動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。 現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們並不知道它到底是哪一種。 有人用兩種說法對這N個動物所構成的食物鏈關係進行描述: 第一種說法是"1 X Y",表示X和Y是同類。 第二種

1182 食物鏈 經典

          思路:設r(x)表示節點x與根結點的關係,px表示x的根結點。記錄每個節點與其父節點的關係,就能很方便知道每個節點以及和它的父節點的關係。 struct node{ int pa

poj 2236【

proc cau pos exp con computer from size ble poj 2236 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Me

poj1182食物鏈-

mission 合並 做的 sin wid AI pst bsp clu 食物鏈 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 83337 Accepted: 24925 D

NOI 2001 食物鏈 /// oj22035

spl 單獨 != 表示 食物 bbb ide AC printf Description 動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。 現有N個動物,以1~N編號。每個動物都是A,B,C中的一種,但是我們並不知道它到底是

poj 1611The Suspects(維護根節點)

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 51095  

POJ 1703 種類

The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TWO gangs in the city, Gang Dragon and G

poj 1988Cube Stacking(路徑壓縮 求本節點到父節點的結點數)

Cube Stacking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 28664 Accepted: 10067 Case Time Limit: 1000MS

poj 1456 Supermarket(維護區間)

 題意:有一些貨物,每個貨物有價值和賣出的截至日期,每天可以賣一個貨物,問能賣出的最大價值是多少。 思路:演算法不難想到,按價值降序排列,對於每一件貨物,從deadline那天開始考慮,如果哪天空

poj 3657Haybale Guessing( 加染色)

Description The cows, who always have an inferiority complex about their intelligence, have a new guessing game to sharpen their brains.

poj-3177(+雙聯通分量+Tarjan算法)

pre ble spl 分享 ++ 每一個 target cstring 就是 題目鏈接:傳送門 思路: 題目要將使每一對草場之間都有至少兩條相互分離的路徑,所以轉化為(一個有橋的連通圖至少加幾條邊才能變為雙聯通圖?) 先將橋刪除,然後原圖變為多個連通塊,每一個連通塊就是一

又見關系POJ 1182 食物鏈為例

for _id scanf rac sin merge als ++ mod 簡單的關系並查集一般非常easy依據給出的關系搞出一個有向的環,那麽兩者之間的關系就變成了兩者之間的距離。 對於此題: 若u。v不在一個集合內,則顯然此條語句會合法(暫且忽略後兩條。下

POJ 1182 食物鏈 種類

() names color http lag ati 偏移 relation 簡單 POJ 1182 膜大牛~寫的超好,很詳細,對於偏移量的確定也有講解~http://blog.csdn.net/niushuai666/article/details/6981689 記得

POJ 1182 食物鏈 (帶權

動物 return i++ rip width d+ oid body 思維 食物鏈 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78551 Accepte

POJ 1182 食物鏈 復習

iostream unit color clu string using pan n) else #include <iostream> #include <algorithm> #include <cstring> #incl