有乙個無向圖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輸出樣例#1: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
顏色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...