diff --git a/hub/hub.cpp b/hub/hub.cpp index e69de29..3cd8bf4 100644 --- a/hub/hub.cpp +++ b/hub/hub.cpp @@ -0,0 +1,104 @@ +#include +using namespace std; +int c, t; +int n, k; +vector fri[1000005]; +int fa[1000005]; +int son[1000005]; +int cnt[1000005]; +int top[1000005]; +int dep[1000005]; +int depmaxson[1000005]; +void dfs1(int now, int from) { + cnt[now] = 1; + depmaxson[now] = dep[now]; + for(int i : fri[now]) { + if(i == from) continue; + fa[i] = now; + dep[i] = dep[now] + 1; + dfs1(i, now); + depmaxson[now] = max(depmaxson[now], depmaxson[i]); + cnt[now] += cnt[i]; + if(cnt[son[now]] < cnt[i]) son[now] = i; + } +} +void dfs2(int now, int from) { + top[now] = from; + if(son[now]) dfs2(son[now], from); + for(int i : fri[now]) { + if(i == fa[now] || i == son[now]) continue; + dfs2(i, i); + } +} +int lca(int a, int b) { + while(top[a] != top[b]) { + if(dep[top[a]] < dep[top[b]]) swap(a, b); + a = fa[top[a]]; + } + if(dep[a] < dep[b]) swap(a, b); + return b; +} +bool chosen[1000005]; +struct BCJ{ + int fa[1000005]; + int find(int x) { + if(fa[x] == x) return x; + return fa[x] = find(fa[x]); + } +}bcj; +void dfs0(int now) { + for(int i : fri[now]) { + if(i == fa[now]) continue; + if(chosen[i] && chosen[now]) bcj.fa[i] = now; + dfs0(i); + } +} +int ans = INT_MAX; +void choose(int now) { + if(now > k) { + bool used[1000005] = {0}; + vector kf; + for(int i = 1; i <= n; ++i) bcj.fa[i] = i; + dfs0(1); + int cnt = 0; + for(int i = 1; i <= n; ++i) { + if(!used[bcj.find(i)]) used[bcj.find(i)] = 1, cnt++, kf.push_back(bcj.find(i)); + if(cnt > 2) return; + } + int l = lca(kf[0], kf[1]); + ans = min(ans, depmaxson[kf[0]] + depmaxson[kf[1]] - 2 * dep[l]); + } + for(int i = 1; i <= n; ++i) { + if(!chosen[i]) chosen[i] = 1, choose(now + 1), chosen[i] = 0; + } +} +int main() { + freopen("hub.in", "r", stdin); + freopen("hub.out", "w", stdout); + scanf("%d%d", &c, &t); + while(t--) { + scanf("%d%d", &n, &k); + for(int i = 1, u, v; i < n; ++i) { + scanf("%d%d", &u, &v); + fri[u].push_back(v); + fri[v].push_back(u); + } + if(k == n) { + printf("0\n"); + for(int i = 1; i <= n; ++i) fri[i].clear(); + } + dfs1(1, 1); + dfs2(1, 1); + choose(1); + printf("%d\n", ans); + for(int i = 1; i <= n; ++i) fri[i].clear(); + ans = INT_MAX; + } + return 0; +} +/* +g++ hub/hub.cpp -o hub/hub -std=c++14 -O2 -static -Wall && cp hub/hub ~ && chmod +x ~/hub && ~/hub + +对于两个连通块中的点,距离为道路条数(lca) + +*/ \ No newline at end of file diff --git a/migrate/migrate.cpp b/migrate/migrate.cpp index 180fd9f..ff24163 100644 --- a/migrate/migrate.cpp +++ b/migrate/migrate.cpp @@ -1,16 +1,36 @@ #include using namespace std; int c, t; -int n, d; -int x[2000005]; +int n; +long long d; +long long x[2000005]; +long long fa[5005][5005]; int main() { freopen("migrate.in", "r", stdin); freopen("migrate.out", "w", stdout); scanf("%d%d", &c, &t); while(t--) { - scanf("%d%d", &n, &d); + scanf("%d%lld", &n, &d); for(int i = 1; i <= n; ++i) { - scanf("%d", &x[i]); + scanf("%lld", &x[i]); + } + if(c <= 10) { + long long ans = 0; + for(int i = 1; i < n; ++i) { + fa[i][i] = 1; + fa[i][i + 1] = (x[i + 1] - x[i] <= d) && (fa[x + 2] - x[i]) > d; + } + fa[n][n] = 1; + for(int len = 2; len <= n; ++len) { + for(int l = 1; l + len - 1 <= n; ++l) { + int r = l + len - 1; + for(int mid = l; mid <= r - 1; ++mid) { + fa[l][r] += fa[l][mid] * fa[mid + 1][r]; + } + if(fa[l][r] == 2) ans++; + } + } + printf("%lld\n", ans); } } return 0; @@ -20,4 +40,5 @@ g++ migrate/migrate.cpp -o migrate/migrate -std=c++14 -O2 -static -Wall && cp mi 每次飞行长度不超过 d 体力消耗为飞行次数 +长度最短一定不回溯 */ \ No newline at end of file diff --git a/subway/subway.cpp b/subway/subway.cpp index 5305e63..7b23d89 100644 --- a/subway/subway.cpp +++ b/subway/subway.cpp @@ -55,7 +55,8 @@ int main() { } } // dig(x); - printf("%lld\n", 1ll * w[x] + 1ll * w[y] + ans); + if(ans == LLONG_MAX) printf("-1\n"); // 疑似算法有问题 + else printf("%lld\n", 1ll * w[x] + 1ll * w[y] + ans); } return 0; } @@ -66,4 +67,6 @@ g++ subway/subway.cpp -o subway/subway -std=c++14 -O2 -static -Wall && cp subway 500 条线路各视为图上的一个点,分别和地铁站连线 考虑优化,注意到可以预处理维护两个地铁线路的最短距离,再枚举起点终点的线路选择 + +爆longlong得到负值(原因为数据构造器未保证连通) */ \ No newline at end of file