lca的倍增策略不僅可以維護最近公共祖先,還可以維護其他具有區間可維護性的資訊,例如本題中維護的最小限重。
本題調了好久,最後發現原因是陣列用混了。以後一定要記準各個陣列含義,千萬不要混啊。。。
1 #include2 #include3 #include4 #include5 #include6除錯**7using
namespace
std;89
const
int maxn = 1e5+10,maxm = 5e5+10;10
11struct
edge
16}edges[maxm],e;
1718
struct node;
1920
intn,m,x,y,z,cnte,q;
21 vectorg[maxn];
2223
intread()
2930
intfa[maxn];
31int find(int
x)35
36void
kruscal());
44g[e.to].push_back((node));45}
46}47}
4849
int jump[maxn][20],wide[maxn][20
];50
intdep[maxn];
5152
void workdep(int rt,int
fa)61}62
63void
initall() 69}
7071
int ask(int x,int
y)80
if(dx !=dy)
84for(int i = 18;i >= 0;i--)if(jump[x][i] !=jump[y][i])
88//
cout << "ans::";
89return min(ans,min(wide[x][0],wide[y][0
]));90}
9192
intmain();
95 q =read();
96kruscal();
97 memset(wide,0x3f,sizeof
(wide));
98for(int i = 1;i <= n;i++)if(!dep[i])workdep(i,0
);99
//cout << "dep: ";for(int i = 1;i <= n;i++)cout << dep[i] << ' ';cout << endl;
100initall();
101102
/*for(int i = 0;i <= 18;i++)
106putchar('\n');
107for(int i = 0;i <= 18;i++)
111putchar('\n');
*/112
113while(q--)printf("
%d\n
",ask(read(),read()));
114return0;
115 }
1 #include2 #include3 #include4 #include5 #include6final7using
namespace
std;89
const
int maxn = 1e5+10,maxm = 5e5+10;10
11struct
edge
16}edges[maxm],e;
1718
struct node;
1920
intn,m,x,y,z,cnte,q;
21 vectorg[maxn];
2223
intread()
2930
intfa[maxn];
31int find(int
x)35
36void
kruscal());
44g[e.to].push_back((node));45}
46}47}
4849
int jump[maxn][20],wide[maxn][20
];50
intdep[maxn];
5152
void workdep(int rt,int
fa)61}62
63void
initall() 69}
7071
int ask(int x,int
y)80
if(dx !=dy)
84for(int i = 18;i >= 0;i--)if(jump[x][i] !=jump[y][i])
88return min(ans,min(wide[x][0],wide[y][0
]));89}
9091
intmain();
94 q =read();
95kruscal();
96 memset(wide,0x3f,sizeof
(wide));
97for(int i = 1;i <= n;i++)if(!dep[i])workdep(i,0
);98
initall();
99while(q--)printf("
%d\n
",ask(read(),read()));
100return0;
101 }
luogu P1967 貨車運輸
題面傳送門 顯然不可以最長路。司機肯定喜歡走長的路徑,所以先把最大生成樹跑出來。然後再最大生成樹上跑倍增不就好了?實現 include include include define min a,b a b a b using namespace std int n,m,k,x,y,ans,flag ...
Luogu P1967 貨車運輸
現在開始正式填以前欠下的一些題解。就從這道經典的noip題開始講吧。我們仔細看題目,發現要求的是圖上兩點 u,v 之間的路徑上最小值的最大值。跑dp?圖上狀態太多了,單次要 o n 的複雜度,直接t飛。我們考慮一種經典方法 將圖轉化為一顆樹來做 由於樹保證聯通,而這裡要求最大化最小值,因此我們很容易...
luogu P1967 貨車運輸
a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入格式 輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔開的整數 n,m,表示 ...