diff --git a/OnlineJudges/lydsy/1196.cpp b/OnlineJudges/lydsy/1196.cpp new file mode 100644 index 0000000..18c913f --- /dev/null +++ b/OnlineJudges/lydsy/1196.cpp @@ -0,0 +1,26 @@ +#include +#include +int fa[10010], X[20010], Y[20010], C1[20010], C2[20010], n, k, m; +int Find(int x) { return fa[x] == -1 ? x : fa[x] = Find(fa[x]); } +bool check(int x) +{ + memset(fa, -1, sizeof(fa)); + int cnt1 = 0, cnt2 = 0; + for (int i = 1, fx, fy; i < m; i++) + if ((C1[i] <= x) && ((fx = Find(X[i])) != (fy = Find(Y[i])))) + cnt1++, fa[fx] = fy; + for (int i = 1, fx, fy; i < m; i++) + if ((C2[i] <= x) && ((fx = Find(X[i])) != (fy = Find(Y[i])))) + cnt2++, fa[fx] = fy; + return cnt1 >= k && cnt1 + cnt2 == n - 1; +} +int main() +{ + scanf("%d%d%d", &n, &k, &m); + for (int i = 1; i < m; i++) + scanf("%d%d%d%d", X + i, Y + i, C1 + i, C2 + i); + int l = 0, r = 0x3f3f3f3f, mid; + while (l < r) check(mid = (l + r) >> 1) ? r = mid : l = mid + 1; + printf("%d", l); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/1821.cpp b/OnlineJudges/lydsy/1821.cpp new file mode 100644 index 0000000..66f2313 --- /dev/null +++ b/OnlineJudges/lydsy/1821.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +#include +using namespace std; +int n, k, fa[1010], X[1010], Y[1010], cnt, ecnt; +double ans; +int Find(int x) { return fa[x] == -1 ? x : fa[x] = Find(fa[x]); } +struct edge +{ + int u, v; + double l; + bool operator<(const edge &rhs) const { return l < rhs.l; } +}edges[1000010]; +int main() +{ + memset(fa, -1, sizeof(fa)); + scanf("%d%d", &n, &k); + for (int i = 1; i <= n; i++) scanf("%d%d", X + i, Y + i); + for (int i = 1; i <= n; i++) + for (int j = 1; j < i; j++, ecnt++) + edges[ecnt].u = i, edges[ecnt].v = j, + edges[ecnt].l = sqrt((X[i] - X[j]) * (X[i] - X[j]) + + (Y[i] - Y[j]) * (Y[i] - Y[j])); + sort(edges, edges + ecnt); + for (int i = 0, fx, fy; i < ecnt; i++) + if ((fx = Find(edges[i].u)) != (fy = Find(edges[i].v))) + { + fa[fx] = fy; + cnt++, ans = edges[i].l; + if (cnt - 1 == n - k) break; + } + printf("%.2lf", ans); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/4152.cpp b/OnlineJudges/lydsy/4152.cpp new file mode 100644 index 0000000..3e16778 --- /dev/null +++ b/OnlineJudges/lydsy/4152.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +using namespace std; +const int maxn = 200010; +inline void readInt(int &x) +{ + int ch = x = 0; + while (!isdigit(ch = getchar())); + for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0'; +} +int head[maxn], to[maxn << 2], nxt[maxn << 2], len[maxn << 2], ecnt, n; +inline void addEdge(int f, int t, int l) +{ + ecnt++; + nxt[ecnt] = head[f]; + head[f] = ecnt; + to[ecnt] = t; + len[ecnt] = l; +} +struct P { int id, x, y; } ps[maxn]; +bool cmpx(const P &lhs, const P &rhs) { return lhs.x < rhs.x; } +bool cmpy(const P &lhs, const P &rhs) { return lhs.y < rhs.y; } +int pathlen[maxn]; +struct heapnode +{ + int id, dis; + heapnode(int x, int y) :id(x), dis(y) {} + bool operator<(const heapnode &rhs) const { return dis > rhs.dis; } +}; +int main() +{ + readInt(n); + for (int i = 0; i < n; i++) ps[i].id = i + 1, readInt(ps[i].x), readInt(ps[i].y); + sort(ps, ps + n, cmpx); + for (int i = 0; i < n - 1; i++) + addEdge(ps[i].id, ps[i + 1].id, ps[i + 1].x - ps[i].x), + addEdge(ps[i + 1].id, ps[i].id, ps[i + 1].x - ps[i].x); + sort(ps, ps + n, cmpy); + for (int i = 0; i < n - 1; i++) + addEdge(ps[i].id, ps[i + 1].id, ps[i + 1].y - ps[i].y), + addEdge(ps[i + 1].id, ps[i].id, ps[i + 1].y - ps[i].y); + memset(pathlen, 0x3f3f3f3f, sizeof(pathlen)); + pathlen[1] = 0; + priority_queue Q; + Q.push(heapnode(1, 0)); + while (!Q.empty()) + { + heapnode x = Q.top(); Q.pop(); + if (x.dis > pathlen[x.id]) continue; + for (int cur = head[x.id]; cur; cur = nxt[cur]) + if (pathlen[to[cur]] > pathlen[x.id] + len[cur]) + { + pathlen[to[cur]] = pathlen[x.id] + len[cur]; + Q.push(heapnode(to[cur], pathlen[to[cur]])); + } + } + printf("%d", pathlen[n]); + return 0; +} \ No newline at end of file