亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【JZOJ3296】【SDOI2013】刺客信條(assassin)

2019-11-06 06:06:29
字體:
來源:轉載
供稿:網友

╰( ̄▽ ̄)╭

Description

故事發生在1486 年的意大利,Ezio 原本只是一個文藝復興時期的貴族,后來因為家族成員受到圣殿騎士的殺害,決心成為一名刺客。最終,憑借著他的努力和出眾的天賦,成為了杰出的刺客大師,他不僅是個身手敏捷的武林高手,飛檐走壁擅長各種暗殺術。刺客組織在他的帶領下,為被剝削的平民聲張正義,趕跑了原本統治意大利的圣殿騎士首領-教皇亞歷山大六世。在他的一生中,經歷了無數次驚心動魄、扣人心弦的探險和刺殺。

曾經有一次,為了尋找Altair 留下的線索和裝備,Ezio 在佛羅倫薩中的刺客墓穴進行探索。這個刺客墓穴中有許多密室,且任何兩個密室之間只存在一條唯一的路徑。這些密室里都有一個刺客標記,他可以啟動或者關閉該刺客標記。為了打開儲存著線索和裝備的儲藏室,Ezio 必須操作刺客標記來揭開古老的封印。要想解開這個封印,他需要通過改變某些刺客標記的啟動情況,使得所有刺客標記與封印密碼“看起來一樣”。

在這里,“看起來一樣”的定義是:存在一種“標記”密室與“密碼”密室之間一一對應的關系,使得密室間的連接情況和啟動情況相同(提示中有更詳細解釋)。幸運的是,在Ezio 來到刺客墓穴之前,在Da Vinci 的幫助下,Ezio 已經得知了打開儲藏室所需要的密碼。

而你的任務則是幫助Ezio 找出達成目標所需要最少的改動標記次數。

對于100%的數據,n<=700,且每個密室至多與11個密室相通。

Input

第一行給出一個整數n,表示密室的個數。 第二行至第n 行,每行給出兩個整數a 和b,表示第a 個密室和第b 個密室之間存在一條通道。 第n+1 行,給出n 個整數,分別表示當時每個密室的啟動情況(0 表示關閉,1 表示啟動)。 第n+2 行,給出n 個整數,分別表示密碼中每個密室的啟動情況。

Output

輸出只有一行,即輸出最少改動標記次數。

Sample Input

4 1 2 2 3 3 4 0 0 1 1 1 0 0 0

Sample Output

1

樣例解釋

密室的編號是可以變的!將第三個密室關閉后,在當前標記和密碼之間,存在1->4,2->3,3->2,4->1 的對應關系,重新編號后連接情況沒有改變,且標記與密碼對應。對于更一般的情況,存在一個1 到n 的置換P,使得對于任意密室之間的道路u-v,都一定有密碼密室中的道路P(u)-P(v);如果不存在密室之間的道路u-v,則一定沒有密碼密室中的道路P(u)-P(v)。

(⊙ ▽ ⊙)

簡化題意

給出一棵樹,找出另一棵同構的樹,使得結點權值差異最小。

做法

先把無根樹轉化為有根樹,關鍵就在于我們如何選擇根: 首先我們選重心做為樹的根,如果重心在邊上,就新建一個結點。 選了重心作為根的好處是: 同構的子樹之間可以互相調換。

如何判斷兩棵子樹同構呢?先給每個結點及其兒子構成的子樹預處理出hash值。深度相同并且hash值也相同的兩個結點所構成的子樹就是同構的兩棵子樹。hash值可以利用double hash

現在先對所有結點按其深度從大到小排序,hash值為第二關鍵字排序。 設f[i][j]表示結點i與結點j調換的最小費用, 前面說過,只有同構并且深度相同的子樹才能調換。 通過這個條件,并且利用排序后的序列,可以簡單地進行轉移。


那么轉移方程怎么寫呢?即f[i][j]=? 由于f[son(i)][]已經求出來了,因為son(i)的深度比i大, 那么通過ij的兒子相互調換,從而達到最小值,使我們的目的。 實際上,這個過程是帶費用的二分圖匹配, 可以利用最小費用最大流或者KM算法完成這個過程,設答案為flow。 那么f[i][j]=flow+(a[i] xor b[j]),其中a,b是輸入中的兩組權值。


由于每個密室至多與11 個密室相通, 所以時間復雜度不會太大。

( ̄~ ̄)

#include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<string.h>#define ll long long#define p1(x) (x+1)#define p2(x) (x+tmd+1)using namespace std;const char* fin="ex3296.in";const char* fout="ex3296.out";const int inf=0x7fffffff;const int maxn=707,maxm=maxn*20,maxN=370,maxM=maxN*2,maxh=99997,maxH=57494,hh=137,HH=97;int n,m,i,j,k,rt;int fi[maxn],ne[maxm],la[maxm],tot,A[maxn],B[maxn];int si[maxn],fa[maxn],ce[3],f[maxn][maxn];int w[maxn],W[maxn];struct node{ int de,h,H,id;}a[maxn];bool cmp(node a,node b){ return a.de>b.de || (a.de==b.de && a.h<b.h) || (a.de==b.de && a.h==b.h && a.H<b.H);}struct network{ int fi[maxN],ne[maxM],la[maxM],va[maxM],co[maxM],tot,num,last[maxN],Last[maxN]; int b[maxN*10],f[maxN],head,tail; bool bz[maxN]; void init(int v){ tot=1; memset(fi,0,sizeof(fi)); num=v; } void add_line(int a,int b,int c,int d){ tot++; ne[tot]=fi[a]; la[tot]=b; va[tot]=c; co[tot]=d; fi[a]=tot; } void add(int a,int b,int c,int d){ add_line(a,b,c,d); add_line(b,a,0,-d); } void add(int v,int dis){ f[v]=dis; if (!bz[v]){ b[++tail]=v; bz[v]=true; } } int spfa(){ int i,j,k,cost=0; head=tail=0; memset(bz,0,sizeof(bz)); memset(f,127,sizeof(f)); add(1,0); while (head++<tail){ for (k=fi[b[head]];k;k=ne[k]) if (va[k] && f[b[head]]+co[k]<f[la[k]]){ Last[la[k]]=k; last[la[k]]=b[head]; add(la[k],f[b[head]]+co[k]); } bz[b[head]]=false; } if (f[num]>2000000000) return -1; for (k=num;k!=1;k=last[k]){ va[Last[k]]--; va[Last[k]^1]++; cost+=co[Last[k]]; } return cost; } int flow(){ int j,k=0; while (1){ j=spfa(); if (j==-1) break; else k+=j; } return k; }}N;void add_line(int a,int b){ tot++; ne[tot]=fi[a]; la[tot]=b; fi[a]=tot;}void dfs(int v,int from){ int i=1,j,k; fa[v]=from; si[v]=1; for (k=fi[v];k;k=ne[k]) if (la[k]!=from){ dfs(la[k],v); si[v]+=si[la[k]]; i&=si[la[k]]<=n/2; } if (i && (n-si[v])<=n/2) ce[++ce[0]]=v;}int t[maxn],T[maxn];void geth(int v,int from){ int i,j,k; fa[v]=from; si[v]=0; a[v].id=v; a[v].de=a[from].de+1; for (k=fi[v];k;k=ne[k]) if (la[k]!=from){ geth(la[k],v); si[v]++; } t[0]=T[0]=0; for (k=fi[v];k;k=ne[k]) if (la[k]!=from) t[++t[0]]=a[la[k]].h,T[++T[0]]=a[la[k]].H; if (!t[0]){ a[v].h=23; a[v].H=89; return ; } sort(t+1,t+t[0]+1),sort(T+1,T+T[0]+1); for (i=1;i<=t[0];i++){ a[v].h=(a[v].h*hh+t[i]*(hh^11))%maxh; a[v].H=(a[v].H*HH+T[i]*(HH^29))%maxH; }}int main(){ scanf("%d",&n); for (i=1;i<n;i++){ scanf("%d%d",&A[i],&B[i]); add_line(A[i],B[i]); add_line(B[i],A[i]); } for (i=1;i<=n;i++) scanf("%d",&w[i]); for (i=1;i<=n;i++) scanf("%d",&W[i]); dfs(1,0); if (ce[0]>1){ memset(fi,0,sizeof(fi)); tot=0; for (i=1;i<n;i++){ if (!(A[i]==ce[1] && B[i]==ce[2] || A[i]==ce[2] && B[i]==ce[1])){ add_line(A[i],B[i]); add_line(B[i],A[i]); } } n++; add_line(n,ce[1]); add_line(ce[1],n); add_line(n,ce[2]); add_line(ce[2],n); rt=n; }else rt=ce[1]; geth(rt,0); sort(a+1,a+n+1,cmp); j=1; memset(f,255,sizeof(f)); for (i=2;i<=n+1;i++) if (i==n+1 || a[i].de!=a[i-1].de || a[i].h!=a[i-1].h || a[i].H!=a[i-1].H){ int tmp=j; for (;j<i;j++) for (k=tmp;k<i;k++){ N.init(si[a[j].id]+si[a[k].id]+2); int l,o,L,O,tmd=si[a[j].id]; for (l=fi[a[j].id],L=1;l;l=ne[l]) if (la[l]!=fa[a[j].id]){ for (o=fi[a[k].id],O=1;o;o=ne[o]) if (la[o]!=fa[a[k].id]){ if (f[la[l]][la[o]]!=-1) N.add(p1(L),p2(O),1,f[la[l]][la[o]]); O++; } L++; } for (l=fi[a[j].id],L=1;l;l=ne[l]) if (la[l]!=fa[a[j].id]) { N.add(1,p1(L),1,0); L++; } for (o=fi[a[k].id],O=1;o;o=ne[o]) if (la[o]!=fa[a[k].id]){ N.add(p2(O),N.num,1,0); O++; } f[a[j].id][a[k].id]= N.flow()+ (w[a[j].id]^W[a[k].id]); (⊙v⊙)

Key Points 1.hash的計算 新加的常數項要乘個系數。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
全球成人中文在线| 亚洲欧美日韩久久久久久| 欧美—级a级欧美特级ar全黄| 国产亚洲精品美女久久久| 亚洲欧美日韩成人| 777午夜精品福利在线观看| 高跟丝袜欧美一区| 成人精品在线视频| 国产成人av在线播放| 日韩在线高清视频| 亚洲国产精品电影在线观看| 亚洲第一福利网站| 亚洲午夜久久久久久久| 亚洲精品自产拍| 亚洲欧美日韩精品久久| 国产原创欧美精品| 亚洲跨种族黑人xxx| 最近免费中文字幕视频2019| 日本亚洲精品在线观看| 欧美高清激情视频| 尤物九九久久国产精品的特点| 久久久久久久久久婷婷| 国产精品久久久久久久久久久久久久| 欧美日韩中文字幕综合视频| 成人综合网网址| 国产不卡一区二区在线播放| 欧美怡春院一区二区三区| 久久久久亚洲精品国产| 国内精品美女av在线播放| 这里精品视频免费| 在线观看精品国产视频| 亚洲一区二区三区在线免费观看| 国产色婷婷国产综合在线理论片a| 欧美一级片在线播放| 久久伊人免费视频| 日韩高清电影免费观看完整| 亚洲精品成人久久久| 欧美激情精品久久久久久久变态| 91免费看片在线| 美女啪啪无遮挡免费久久网站| 美女av一区二区| 亚洲最大的成人网| 欧洲一区二区视频| 亚洲欧美资源在线| 一区二区三区天堂av| 久久人91精品久久久久久不卡| 91精品国产99久久久久久| 久久人人爽亚洲精品天堂| 欧美性猛交xxxx富婆| 国产日韩欧美一二三区| 日韩有码视频在线| 日韩成人在线视频| 国产精品一香蕉国产线看观看| 国产最新精品视频| 操日韩av在线电影| 国产成人av网| 在线观看国产欧美| 欧美老女人bb| 久久香蕉频线观| 中文字幕日韩欧美在线视频| 性色av一区二区三区| 一区二区三区天堂av| 国产欧美精品xxxx另类| 久久精品亚洲一区| 国产精自产拍久久久久久| 国产日韩在线亚洲字幕中文| 最好看的2019的中文字幕视频| 91av中文字幕| 国产精品电影网| 久热精品在线视频| 亚洲人成电影网站色xx| 亚洲自拍欧美另类| 国产精品露脸av在线| 亚洲午夜精品视频| 国产精品久久久久久久久久久不卡| 大荫蒂欧美视频另类xxxx| 国产精品尤物福利片在线观看| 亚洲福利视频专区| 亚洲无av在线中文字幕| 成人黄色短视频在线观看| 亚洲尤物视频网| 中文字幕欧美日韩在线| 国内精品视频在线| 中文字幕亚洲欧美日韩高清| 国产99视频在线观看| 欧美成人精品一区| 成人午夜在线视频一区| 国产精品极品美女粉嫩高清在线| 欧美精品亚州精品| 亚洲风情亚aⅴ在线发布| 日本最新高清不卡中文字幕| 最近的2019中文字幕免费一页| 亚洲天堂男人天堂| 亚洲www永久成人夜色| 欧美性xxxx极品高清hd直播| 国产有码在线一区二区视频| 欧美精品一二区| 色妞色视频一区二区三区四区| 疯狂做受xxxx欧美肥白少妇| 亚洲性日韩精品一区二区| 亚洲免费视频在线观看| 国产精品一区二区女厕厕| 美日韩精品免费观看视频| 亚洲欧美日韩一区二区在线| 国产欧美日韩免费看aⅴ视频| 欧美一级高清免费播放| 亚洲国产成人在线视频| 欧美性受xxxx白人性爽| 亚洲人成在线观看网站高清| 日韩大片在线观看视频| 福利精品视频在线| 91精品视频免费观看| 2020国产精品视频| 亚洲天堂第一页| 国产精品久久久久av免费| 91色中文字幕| 亚洲欧美精品在线| 超薄丝袜一区二区| 成人精品网站在线观看| 九九久久国产精品| 国产精品热视频| 日韩中文在线观看| 欧美日韩国产中字| 91久久久亚洲精品| 亚洲欧美日韩精品久久亚洲区| 精品日韩美女的视频高清| 国产精品久久久久久久久久ktv| 亚洲国产精品va在线看黑人| 在线观看久久av| 欧美激情区在线播放| 92福利视频午夜1000合集在线观看| 亚洲一区二区三区成人在线视频精品| 日韩在线欧美在线国产在线| 九九九久久国产免费| 91精品国产777在线观看| 国色天香2019中文字幕在线观看| 亚洲成人黄色在线观看| 亚洲人成亚洲人成在线观看| 国产日产欧美精品| 欧美日韩国产成人高清视频| 国产精品中文在线| 国产精品av网站| 68精品国产免费久久久久久婷婷| 国产亚洲精品美女| 国产精品成人在线| 国产精品视频久久久久| 欧美亚洲视频一区二区| 日韩最新在线视频| 亚洲一区av在线播放| 一区二区三区无码高清视频| 日韩中文在线视频| 91国自产精品中文字幕亚洲| 国产精国产精品| 色播久久人人爽人人爽人人片视av| 国产精品永久免费在线| 日韩av电影手机在线观看| 欧美性猛交xxxx乱大交| 日韩欧美综合在线视频| 一二美女精品欧洲| 亚洲欧美激情精品一区二区| 欧美www视频在线观看| 国产999精品久久久影片官网| 国产精品永久免费在线| 91青草视频久久|