bzoj 1196 1821 4152 (狗日的数组越界我调了一个小时才发现)
parent
6c2387b780
commit
176c835c9e
@ -0,0 +1,26 @@
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
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;
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
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;
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
#include <algorithm>
|
||||
#include <cctype>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <queue>
|
||||
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<heapnode> 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;
|
||||
}
|
||||
Loading…
Reference in new issue