bzoj 1007 1486 1491
parent
64540c1433
commit
825858364c
@ -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…
Reference in new issue