bzoj 1007 1486 1491

pull/1/head
雷宇辰 9 years ago
parent 637bdf84d5
commit 57d610fa2b

@ -0,0 +1,30 @@
#include <cstdio>
#include <algorithm>
struct line
{
int k, b, id;
bool operator<(const line &rhs) const { return (k < rhs.k) || (k == rhs.k && b > rhs.b); }
}a[50010];
int n;
int stk[50010], top;
bool ans[50010];
bool check(int x, int y, int z)
{
return 1ll * (a[y].k - a[z].k) * (a[y].b - a[x].b) >= 1ll * (a[z].b - a[y].b) * (a[x].k - a[y].k);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d%d", &a[i].k, &a[i].b), a[i].id = i + 1;
std::sort(a, a + n);
stk[top++] = 0;
for (int i = 1; i < n; i++)
{
if (a[i].k == a[stk[top - 1]].k) continue;
while (top > 1 && check(stk[top - 2], stk[top - 1], i)) top--;
stk[top++] = i;
}
while (top) ans[a[stk[--top]].id] = true;
for (int i = 0; i <= n; i++) if (ans[i]) printf("%d ", i);
return 0;
}

@ -0,0 +1,50 @@
#include <cstdio>
#include <cstring>
const double eps = 1e-9;
template <typename T> T max(T a, T b) { return a > b ? a : b; }
template <typename T> T min(T a, T b) { return a < b ? a : b; }
int head[3010], next[10010], to[10010], ecnt, n, m, flag, flags[3010];
double a[10010], len[10010], dis[3010];
inline void addEdge(int x, int y)
{
ecnt++;
next[ecnt] = head[x];
head[x] = ecnt;
to[ecnt] = y;
}
bool dfs(int x)
{
if (flags[x] == flag) return true;
flags[x] = flag;
for (int cur = head[x]; cur; cur = next[cur])
if (dis[to[cur]] > dis[x] + len[cur])
{
dis[to[cur]] = dis[x] + len[cur];
if (dfs(to[cur])) return true;
}
flags[x] = 0;
return false;
}
bool check(double x)
{
for (int i = 1; i <= m; i++) len[i] = a[i] - x;
for (int i = 1; i <= n; i++)
{
flag++;
memset(dis, 0, sizeof(dis));
if (dfs(i)) return true;
}
return false;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1, x, y; i <= m; i++)
scanf("%d%d%lf", &x, &y, a + i), addEdge(x, y);
double l = 1e304, r = -1e304, mid;
for (int i = 1; i <= m; i++)
l = min(l, a[i]), r = max(r, a[i]);
while (r - l > eps) (check(mid = (l + r) / 2) ? r : l) = mid;
printf("%.8lf", (l + r) / 2);
return 0;
}

@ -0,0 +1,31 @@
#include <cstdio>
#include <cstring>
int G[101][101], n, m;
long long a[101][101];
double ans[101];
int main()
{
memset(G, 0x3f3f3f3f, sizeof(G));
scanf("%d%d", &n, &m);
for (int i = 0, x, y, z; i < m; i++)
{
scanf("%d%d%d", &x, &y, &z);
G[x][y] = G[y][x] = z;
a[x][y] = a[y][x] = 1;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (G[i][j] > G[i][k] + G[k][j]) G[i][j] = G[i][k] + G[k][j], a[i][j] = 0;
if (G[i][j] == G[i][k] + G[k][j]) a[i][j] += a[i][k] * a[k][j];
}
for (int i = 1; i <= n; i++) a[i][i] = 0;
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (G[i][j] == G[i][k] + G[k][j] && a[i][j] > 0)
ans[k] += 1.0 * a[i][k] * a[k][j] / a[i][j];
for (int i = 1; i <= n; i++) printf("%.3lf\n", ans[i]);
return 0;
}
Loading…
Cancel
Save