bzoj 1196 1821 4152 (狗日的数组越界我调了一个小时才发现)

master
大蒟蒻 9 years ago
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…
Cancel
Save