From 083fa23f2ea4d8233968d705f7c7687f7a29f421 Mon Sep 17 00:00:00 2001 From: TooYoungTooSimp <6648049+TooYoungTooSimp@users.noreply.github.com> Date: Wed, 21 Dec 2016 07:47:18 +0800 Subject: [PATCH] bzoj 1059 1191 1433 1509 1854 2438 3436 --- OnlineJudges/lydsy/1059.cpp | 31 +++++++++++++++++ OnlineJudges/lydsy/1191.cpp | 39 ++++++++++++++++++++++ OnlineJudges/lydsy/1433.cpp | 45 +++++++++++++++++++++++++ OnlineJudges/lydsy/1509.cpp | 49 +++++++++++++++++++++++++++ OnlineJudges/lydsy/1854.cpp | 39 ++++++++++++++++++++++ OnlineJudges/lydsy/2438.cpp | 66 +++++++++++++++++++++++++++++++++++++ OnlineJudges/lydsy/3436.cpp | 41 +++++++++++++++++++++++ 7 files changed, 310 insertions(+) create mode 100644 OnlineJudges/lydsy/1059.cpp create mode 100644 OnlineJudges/lydsy/1191.cpp create mode 100644 OnlineJudges/lydsy/1433.cpp create mode 100644 OnlineJudges/lydsy/1509.cpp create mode 100644 OnlineJudges/lydsy/1854.cpp create mode 100644 OnlineJudges/lydsy/2438.cpp create mode 100644 OnlineJudges/lydsy/3436.cpp diff --git a/OnlineJudges/lydsy/1059.cpp b/OnlineJudges/lydsy/1059.cpp new file mode 100644 index 0000000..15d5a36 --- /dev/null +++ b/OnlineJudges/lydsy/1059.cpp @@ -0,0 +1,31 @@ +#include +int T, n, tmp, g[205][205], st, vis[205], pre[205]; +bool dfs(int u) +{ + for (int v = 1; v <= n; v++) if (g[u][v]) if (vis[v] != st) + { + vis[v] = st; + if (pre[v] == 0 || dfs(pre[v])) + { + pre[v] = u; + return true; + } + } + return false; +} +int main() +{ + scanf("%d", &T); + while (T--) + { + scanf("%d", &n); + for (int i = 1; i <= n; i++) + for (int j = 1; j <= n; j++) + scanf("%d", &g[i][j]); + tmp = n; + for (int i = 1; i <= n; i++) pre[i] = vis[i] = 0; + for (st = 1; st <= n; st++) tmp -= dfs(st); + puts(tmp ? "No" : "Yes"); + } + return 0; +} diff --git a/OnlineJudges/lydsy/1191.cpp b/OnlineJudges/lydsy/1191.cpp new file mode 100644 index 0000000..39762ff --- /dev/null +++ b/OnlineJudges/lydsy/1191.cpp @@ -0,0 +1,39 @@ +#include +int head[1001], next[1001 << 1], to[1001 << 1], ecnt, ts; +int vis[1001], pre[1001]; +inline void addEdge(int f, int t) +{ + ecnt++; + next[ecnt] = head[f]; + head[f] = ecnt; + to[ecnt] = t; +} +bool dfs(int u) +{ + for (int cur = head[u], v; cur; cur = next[cur]) + if (vis[to[cur]] != ts) + { + v = to[cur], vis[v] = ts; + if (!pre[v] || dfs(pre[v])) + { + pre[v] = u; + return true; + } + } + return false; +} +int main() +{ + int n, m; + scanf("%d%d", &n, &m); + for (int i = 1, x, y; i <= m; i++) + { + scanf("%d%d", &x, &y); + addEdge(i, x); + addEdge(i, y); + } + for (ts = 1; ts <= m + 1; ts++) + if (!dfs(ts)) break; + printf("%d", ts - 1); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/1433.cpp b/OnlineJudges/lydsy/1433.cpp new file mode 100644 index 0000000..4d7609a --- /dev/null +++ b/OnlineJudges/lydsy/1433.cpp @@ -0,0 +1,45 @@ +#include +#include +inline int readInt(int &x) +{ + int ch = x = 0; + while (!isdigit(ch = getchar())); + for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0'; + return x; +} +int T, n, tmp, g[55][55], b[55], c[55], st, vis[55], pre[55]; +bool dfs(int u) +{ + for (int v = 1; v <= n; v++) if (g[u][v]) if (vis[v] != st) + { + vis[v] = st; + if (pre[v] == 0 || dfs(pre[v])) + { + pre[v] = u; + return true; + } + } + return false; +} +int main() +{ + readInt(T); + while (T--) + { + readInt(n); + for (int i = 1; i <= n; i++) readInt(b[i]); + for (int i = 1; i <= n; i++) readInt(c[i]); + for (int i = 1; i <= n; i++) + for (int j = 1; j <= n; j++) + { + readInt(tmp); + g[i][j] = ((i == j && b[i] == 1 && c[i] == 0) || ((b[i] == 0 || (b[i] == 1 && c[i] == 0)) && tmp && b[j] == 1)); + } + tmp = 0; + for (int i = 1; i <= n; i++) pre[i] = vis[i] = 0; + for (int i = 1; i <= n; i++) if (b[i] == 0 || (b[i] == 1 && c[i] == 0)) tmp++; + for (st = 1; st <= n; st++) tmp -= dfs(st); + puts(tmp ? "T_T" : "^_^"); + } + return 0; +} diff --git a/OnlineJudges/lydsy/1509.cpp b/OnlineJudges/lydsy/1509.cpp new file mode 100644 index 0000000..de708c5 --- /dev/null +++ b/OnlineJudges/lydsy/1509.cpp @@ -0,0 +1,49 @@ +#include +#include +template inline T max(T a, T b) { return a > b ? a : b; } +template inline T min(T a, T b) { return a < b ? a : b; } +int head[200005], next[200005 << 2], to[200005 << 2], len[200005 << 2], ecnt, n, m, que[200005 << 1]; +long long disa[200005], disb[200005]; +inline void addEdge(int f, int t, int l) +{ + ecnt++; + next[ecnt] = head[f]; + head[f] = ecnt; + to[ecnt] = t; + len[ecnt] = l; +} +int bfs(int s, long long *dis) +{ + int h = 0, t = 0; + dis[s] = 0; + que[t++] = s; + for (int x; h != t; h++) + for (int cur = head[x = que[h]]; cur; cur = next[cur]) + if (dis[to[cur]] == -1) + dis[que[t++] = to[cur]] = dis[x] + len[cur]; + int id = -1; long long val = -1; + for (int i = 1; i <= n; i++) + if (dis[i] > val) val = dis[id = i]; + return id; +} +int main() +{ + scanf("%d%d", &n, &m); + for (int i = 0, x, y, z; i < m; i++) + { + scanf("%d%d%d", &x, &y, &z); + addEdge(x, y, z); + addEdge(y, x, z); + } + memset(disa, -1, sizeof(disa)); + memset(disb, -1, sizeof(disb)); + int a = bfs(1, disa); + memset(disa, -1, sizeof(disa)); + int b = bfs(a, disa); + bfs(b, disb); + long long ans = 0; + for (int i = 1; i <= n; i++) ans = max(ans, min(disa[i], disb[i])); + ans += disb[a]; + printf("%lld", ans); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/1854.cpp b/OnlineJudges/lydsy/1854.cpp new file mode 100644 index 0000000..99a673a --- /dev/null +++ b/OnlineJudges/lydsy/1854.cpp @@ -0,0 +1,39 @@ +#include +int head[10010], next[2000010], to[2000010], ecnt, ts; +int vis[1000010], pre[1000010]; +inline void addEdge(int f, int t) +{ + ecnt++; + next[ecnt] = head[f]; + head[f] = ecnt; + to[ecnt] = t; +} +bool dfs(int u) +{ + for (int cur = head[u], v; cur; cur = next[cur]) + if (vis[to[cur]] != ts) + { + v = to[cur], vis[v] = ts; + if (!pre[v] || dfs(pre[v])) + { + pre[v] = u; + return true; + } + } + return false; +} +int main() +{ + int n; + scanf("%d", &n); + for (int i = 1, x, y; i <= n; i++) + { + scanf("%d%d", &x, &y); + addEdge(x, i); + addEdge(y, i); + } + for (ts = 1; ts <= 10001; ts++) + if (!dfs(ts)) break; + printf("%d", ts - 1); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/2438.cpp b/OnlineJudges/lydsy/2438.cpp new file mode 100644 index 0000000..e9b2d99 --- /dev/null +++ b/OnlineJudges/lydsy/2438.cpp @@ -0,0 +1,66 @@ +#include +inline int min(int a, int b) { return a < b ? a : b; } +int n, m, head[100010], next[300010], to[300010], ecnt, +scc[100010], scccnt, st[100010], top, dfn[100010], low[100010], idx, +nHead[100010], nNext[300010], nTo[300010], nEcnt, in[100010], sccsz[100010]; +bool instack[100010]; +inline void addEdge(int f, int t) +{ + ecnt++; + next[ecnt] = head[f]; + head[f] = ecnt; + to[ecnt] = t; +} +inline void addEdgeN(int f, int t) +{ + nEcnt++; + nNext[nEcnt] = nHead[f]; + nHead[f] = nEcnt; + nTo[nEcnt] = t; +} +void tarjan(int u) +{ + dfn[u] = low[u] = ++idx; + instack[st[top++] = u] = true; + for (int cur = head[u]; cur; cur = next[cur]) + if (!dfn[to[cur]]) tarjan(to[cur]), low[u] = min(low[u], low[to[cur]]); + else if (instack[to[cur]]) + low[u] = min(low[u], dfn[to[cur]]); + if (dfn[u] == low[u]) + { + scccnt++; + do + { + top--; + scc[st[top]] = scccnt; + instack[st[top]] = false; + sccsz[scccnt]++; + } while (st[top] != u); + } +} +int main() +{ + scanf("%d%d", &n, &m); + for (int i = 1, x, y; i <= m; i++) + { + scanf("%d%d", &x, &y); + addEdge(x, y); + } + for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); + for (int i = 1; i <= n; i++) + for (int cur = head[i]; cur; cur = next[cur]) + if (scc[i] != scc[to[cur]]) + addEdgeN(scc[i], scc[to[cur]]), in[scc[to[cur]]]++; + int cnt = 0; + for (int i = 1; i <= scccnt; i++) if (in[i] == 0) cnt++; + for (int i = 1; i <= scccnt; i++) + if (sccsz[i] == 1 && in[i] == 0) + { + bool flag = true; + for (int j = nHead[i]; j; j = nNext[j]) + if (in[nTo[j]] <= 1) { flag = false; break; } + if (flag) { cnt--; break; } + } + printf("%.6lf", 1.0 * (n - cnt) / n); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/3436.cpp b/OnlineJudges/lydsy/3436.cpp new file mode 100644 index 0000000..f67c762 --- /dev/null +++ b/OnlineJudges/lydsy/3436.cpp @@ -0,0 +1,41 @@ +#include +#include +int head[10010], next[10010], to[10010], len[10010], ecnt, n, m, dis[10010]; +bool flag, inq[10010]; +inline void addEdge(int f, int t, int l) +{ + ecnt++; + next[ecnt] = head[f]; + head[f] = ecnt; + to[ecnt] = t; + len[ecnt] = l; +} +void dfs(int x) +{ + if (flag) return; + inq[x] = true; + 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 (!inq[to[cur]]) dfs(to[cur]); + else { flag = true; return; } + } + inq[x] = false; +} +int main() +{ + memset(dis, 0x3f3f3f3f, sizeof(dis)); + scanf("%d%d", &n, &m); + for (int i = 0, op, x, y, z; i < m; i++) + { + scanf("%d%d%d", &op, &x, &y); + if (op == 1) scanf("%d", &z), addEdge(x, y, -z); + if (op == 2) scanf("%d", &z), addEdge(y, x, z); + if (op == 3) addEdge(x, y, 0); + } + for (int i = 1; i <= n; i++) + dis[i] = 0, dfs(i); + puts(flag ? "No" : "Yes"); + return 0; +} \ No newline at end of file