ZJOI2012網路 題解報告 LCT

2022-02-28 01:43:15 字數 3790 閱讀 1914

有乙個無向圖g,每個點有個權值,每條邊有乙個顏色。這個無向圖滿足以下兩個條件:

對於任意節點連出去的邊中,相同顏色的邊不超過兩條。

圖中不存在同色的環,同色的環指相同顏色的邊構成的環。

在這個圖上,你要支援以下三種操作:

修改乙個節點的權值。

修改一條邊的顏色。

查詢由顏色c的邊構成的圖中,所有可能在節點u到節點v之間的簡單路徑上的節點的權值的最大值。

輸入格式:

輸入檔案network.in的第一行包含四個正整數n, m, c, k,其中n為節點個數,m為邊數,c為邊的顏色數,k為運算元。

接下來n行,每行乙個正整數vi,為節點i的權值。

之後m行,每行三個正整數u, v, w,為一條連線節點u和節點v的邊,顏色為w。滿足1 ≤ u, v ≤ n,0 ≤ w < c,保證u ≠ v,且任意兩個節點之間最多存在一條邊(無論顏色)。

最後k行,每行表示乙個操作。每行的第乙個整數k表示操作型別。

k = 0為修改節點權值操作,之後兩個正整數x和y,表示將節點x的權值vx修改為y。

k = 1為修改邊的顏色操作,之後三個正整數u, v和w,表示將連線節點u和節點v的邊的顏色修改為顏色w。滿足0 ≤ w < c。

k = 2為查詢操作,之後三個正整數c, u和v,表示查詢所有可能在節點u到節點v之間的由顏色c構成的簡單路徑上的節點的權值的最大值。如果不存在u和v之間不存在由顏色c構成的路徑,那麼輸出「-1」。

輸出格式:

輸出檔案network.out包含若干行,每行輸出乙個對應的資訊。

對於修改節點權值操作,不需要輸出資訊。

對於修改邊的顏色操作,按以下幾類輸出:

a) 若不存在連線節點u和節點v的邊,輸出「no such edge.」。

b) 若修改後不滿足條件1,不修改邊的顏色,並輸出「error 1.」。

c) 若修改後不滿足條件2,不修改邊的顏色,並輸出「error 2.」。

d) 其他情況,成功修改邊的顏色,並輸出「success.」。

輸出滿足條件的第一條資訊即可,即若同時滿足b和c,則只需要輸出「error 1.」。

對於查詢操作,直接輸出乙個整數。

輸入樣例#1:

4 5 2 712

341 2 0

1 3 1

2 3 0

2 4 1

3 4 0

2 0 1 4

1 1 2 1

1 4 3 1

2 0 1 4

1 2 3 1

0 2 5

2 1 1 4

輸出樣例#1:

顏色0為實線的邊,顏色1為虛線的邊,

由顏色0構成的從節點1到節點4的路徑有1 – 2 – 4,故max = max = 4。

將連線節點1和節點2的邊修改為顏色1,修改成功,輸出「success.」

將連線節點4和節點3的邊修改為顏色1,由於修改後會使得存在由顏色1構成的環( 1 – 2 – 4 – 3 – 1 ),不滿足條件2,故不修改,並輸出「error 2」。

不存在顏色0構成的從節點1到節點4的邊,輸出「-1」。

將連線節點2和節點3的邊修改為顏色1,由於修改後節點2的連出去的顏色為1的邊有3條,故不滿足條件1,故不修改,並輸出「error 1.」。

將節點2的權值修改為5。

由顏色1構成的從節點1到節點4的路徑有 1 – 2 – 4,故max = max = 5。

【資料規模】

對於30%的資料:n ≤ 1000,m ≤ 10000,c ≤ 10,k ≤ 1000。

另有20%的資料:n ≤ 10000,m ≤ 100000,c = 1,k ≤ 100000。

對於100%的資料:n ≤ 10000,m ≤ 100000,c ≤ 10,k ≤ 100000。

題目拿來一看,路徑唯一,那麼對於每種顏色就是一棵樹,而且是動態的樹,顏色改變就相當於斷邊與連邊

很自然就想到對於每種顏色各建一棵lct

很方地往下看資料範圍。。。。nice√最多也就10種顏色,完全可以承受

由於乙個節點的邊最多兩條,可以將它存下來,每次修改顏色時暴力查詢就好了,不用想太多。。

【修改顏色甚至有可能是原來的顏色= =,忽略這個就才20分。。。加上一句特判就a了。。。扯淡吧。。】

#include#include#include#include#define ll long long int

#define isr(u,c) (e[c][e[c][u].f].ch[1] == u)

#define isrt(u,c) (!e[c][u].f || (e[c][e[c][u].f].ch[0] != u && e[c][e[c][u].f].ch[1] != u))

using namespace std;

const int maxn = 10005,maxm = 100005,inf = 200000000;

inline int read()

while (c >= 48 && c <= 57)

return out * flag;

}int n,m,c,k,temp[maxn];

int edge[maxn][11][3];

struct node

}e[11][maxn];

inline void push_up(int u,int c)

inline void pd(int u,int c)

}inline void push_down(int u,int c) while(!isrt(u,c) && (u = e[c][u].f));

while (i) pd(temp[i--],c);

}inline int find(int u,int c)

inline void spin(int u,int c)

inline void splay(int u,int c)

push_up(u,c);

}inline void access(int u,int c)

}inline void make_root(int u,int c)

inline bool link(int u,int v,int c)

make_root(u,c); access(v,c); splay(v,c);

e[c][u].f = v;

return true;

}inline void cut(int u,int v,int c)

inline void change(int u,int w)

}inline int query(int u,int v,int c)

void init()

while (m--)

}void solve()else if (k == 1)

if (c == -1) printf("no such edge.\n");

else if(c == z) printf("success.\n");

else if(edge[x][z][0] == 2 || edge[y][z][0] == 2) printf("error 1.\n");

else

}}else }}

int main()

ZJOI2012一試 旅遊 題解 最長鏈 bfs

題目大意 小白和小藍到t國旅遊,t國是乙個凸 n 邊形,包含 n 2 個城市,城市組成了關於 t 國的乙個三角剖分,兩人的旅遊路線可以看做是連線 n 個頂點中不相鄰兩點的線段,求旅遊路線能經過的最多的城市的數量?解題報告 如果判斷是否經過乙個城市,其實就是判斷連線n個頂點中不相鄰兩點的線段 即旅遊路...

ZJOI2010 網路擴容

題目描述 給定一張有向圖,每條邊都有乙個容量c和乙個擴容費用w。這裡擴容費用是指將容量擴大1所需的費用。求 1 在不擴容的情況下,1到n的最大流 2 將1到n的最大流增加k所需的最小擴容費用。輸入格式 輸入檔案的第一行包含三個整數n,m,k,表示有向圖的點數 邊數以及所需要增加的流量。接下來的m行每...

ZJOI2010 網路擴容

最大流 費用流 洛谷位址 第一問就直接跑最大流。第二問目前有兩種方法 include include include include using namespace std define inf 0x7fffffff int n,m,k,s,t struct edgee 100005 int fir...