Skip to content

Commit a88140f

Browse files
committed
changchun regional 2012
1 parent fcbd633 commit a88140f

File tree

6 files changed

+450
-0
lines changed

6 files changed

+450
-0
lines changed

ZJU/ZJU_2588_bridge.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/*
2+
* Finding the bridge of undirected graph (with multiple edges between two nodes)
3+
*/
4+
#include <cstdio>
5+
#include <algorithm>
6+
#include <vector>
7+
#include <cstring>
8+
using namespace std;
9+
const int N = 10010;
10+
const int M = 300000;
11+
12+
struct enode {
13+
int to, nxt, id;
14+
enode () {};
15+
enode (int tt, int nn, int dd): to (tt), nxt (nn), id(dd) {};
16+
}e[M];
17+
int eb[N], en;
18+
19+
int bic_vis[N], bic_low[N], n, m, stamp, Nbridge;
20+
bool isBridge[M];
21+
22+
void adde (int x, int y, int id) {
23+
e[en] = enode (y, eb[x], id);
24+
eb[x] = en++;
25+
26+
e[en] = enode (x, eb[y], id);
27+
eb[y] = en++;
28+
}
29+
30+
void DFS (int x, int pre) {
31+
int i, j;
32+
bic_vis[x] = bic_low[x] = ++ stamp;
33+
for (int ee = eb[x]; ee != -1; ee = e[ee].nxt) if (pre == -1 || e[ee].id != e[pre].id) {
34+
j = e[ee].to;
35+
if (!bic_vis[j]) {
36+
DFS (j, ee);
37+
bic_low[x] = min (bic_low[x], bic_low[j]);
38+
if (bic_low[j] > bic_vis[x])
39+
isBridge[e[ee].id] = true, Nbridge ++;
40+
}
41+
else bic_low[x] = min (bic_low[x], bic_vis[j]);
42+
}
43+
}
44+
45+
vector <pair<int,int> >edge;
46+
int main ()
47+
{
48+
int i, j, k, T;
49+
scanf ("%d", &T);
50+
for (int ca = 1; ca <= T; ca ++) {
51+
memset (eb, -1, sizeof (eb));
52+
en = 0;
53+
memset (bic_vis, 0, sizeof (bic_vis));
54+
memset (bic_low, 0, sizeof (bic_low));
55+
memset (isBridge, false, sizeof (isBridge));
56+
stamp = Nbridge = 0;
57+
58+
scanf ("%d%d", &n, &m);
59+
for (k = 1; k <= m; k++) {
60+
scanf ("%d%d", &i, &j);
61+
edge.push_back (make_pair (i, j));
62+
adde (i, j, k);
63+
}
64+
65+
DFS (1, -1);
66+
printf ("%d\n", Nbridge);
67+
for (i = 0, j = 0; i < m; i++) {
68+
if (isBridge[i+1]){ j++;
69+
printf ("%d%c", i + 1, j == Nbridge ? '\n': ' ');
70+
}
71+
}
72+
if (ca != T) printf ("\n");
73+
}
74+
return 0;
75+
}

ZJU/ZJU_3318.cpp

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
/*
2+
* ZJU 3318: DP: forward is better than backward
3+
* 3/19/2012, 10:47 pm
4+
*/
5+
#include <iostream>
6+
#include <vector>
7+
#include <queue>
8+
#include <string>
9+
#include <list>
10+
#include <set>
11+
#include <map>
12+
#include <sstream>
13+
#include <algorithm>
14+
#include <cstring>
15+
#include <cmath>
16+
#include <ctime>
17+
#include <cstdio>
18+
19+
using namespace std;
20+
21+
typedef long long ll;
22+
typedef pair<int,int> PII;
23+
typedef vector<int> VI;
24+
typedef vector<string> VS;
25+
#define pb push_back
26+
#define mp make_pair
27+
#define ff first
28+
#define ss second
29+
#define sz(v) (int)v.size()
30+
#define clr(x, v) memset(x, v, sizeof(x))
31+
#define rep(i, l, u) for(int i = (l); i < (u); i++)
32+
#define repv(i, v) for(i = 0; i < (int)v.size(); i++)
33+
#define repi(it, c) for(typeof(c.begin()) it = c.begin(); it != c.end(); ++it)
34+
35+
const int N = 35;
36+
const int DA = 35;
37+
const int inf = 1000;
38+
39+
bool g[DA][N][N];
40+
bool ad[N][N];
41+
int n;
42+
43+
int BFS (int sc, int ds)
44+
{
45+
int i, j;
46+
int q[N], head, tail;
47+
bool st[N] = {false};
48+
int dis[N]; for (i = 1; i <= n; i++) dis[i] = inf;
49+
q[head = tail = 1] = sc; st[sc] = true; dis[sc] = 0;
50+
if (sc == ds) return 0;
51+
while (head <= tail) {
52+
i = q[head++];
53+
for (j = 1; j <= n; j++) if (ad[i][j] && !st[j]) {
54+
st[j] = true; dis[j] = dis[i] + 1;
55+
if ((q[++tail] = j) == ds) return dis[ds];
56+
}
57+
}
58+
return dis[ds];
59+
}
60+
61+
int main ()
62+
{
63+
int i, j, k, m, T, Nrd, sc, ds;
64+
int d[DA];
65+
66+
for (scanf ("%d", &T); T; T--) {
67+
clr (g, false);
68+
scanf ("%d%d%d%d", &n, &m, &sc, &ds);
69+
for (k = 1; k <= m; k++) {
70+
for (scanf ("%d", &Nrd); Nrd; Nrd--) {
71+
scanf ("%d%d", &i, &j);
72+
g[k][i][j] = g[k][j][i] = true;
73+
}
74+
}
75+
for (i = 1; i <= m; i++) d[i] = inf*inf;
76+
for (i = 0; i < m; i++) {
77+
clr (ad, true);
78+
for (j = i + 1; j <= m; j++) {
79+
rep (ii, 1, n + 1)
80+
rep (jj, 1, n + 1)
81+
ad[ii][jj] = ad[ii][jj] && g[j][ii][jj];
82+
k = BFS (sc, ds);
83+
if (i == 0)
84+
d[j] = k * j;
85+
else d[j] = min (d[j], d[i] + k * (j-i) + 1);
86+
}
87+
}
88+
printf ("%d\n", d[m]);
89+
}
90+
return 0;
91+
}
92+
93+
94+
95+
96+

ZJU/ZJU_3331.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
#include <algorithm>
4+
using namespace std;
5+
6+
const int N = 110;
7+
int d[N][N<<1];
8+
int main () {
9+
int i, j, k, ta, tb, T, n;
10+
for (scanf ("%d", &T); T; T--) {
11+
scanf ("%d", &n);
12+
memset (d, 0x3f, sizeof (d));
13+
d[0][100] = 0;
14+
for (i = 0; i < n; i++) {
15+
scanf ("%d%d", &ta, &tb);
16+
for (j = 0; j <= 200; j++) {
17+
if ( j >= 100 ) {
18+
d[i+1][ta+100] = min (d[i+1][ta+100], d[i][j] + ta);
19+
d[i+1][j - tb] = min (d[i+1][j - tb], (j - 100 >= tb ? d[i][j]: d[i][j] + 100 + tb - j));
20+
}
21+
else {
22+
d[i + 1][100 - tb] = min (d[i + 1][100 - tb], d[i][j] + tb);
23+
d[i + 1][j + ta] = min (d[i + 1][j + ta], j + ta >= 100 ? d[i][j] + ta + j - 100 : d[i][j]);
24+
}
25+
}
26+
}
27+
int ans = 1000000010;
28+
for (j = 0; j <= 200; j++) ans = min (ans, d[n][j]);
29+
printf ("%d\n", ans);
30+
}
31+
return 0;
32+
}
33+
34+
35+

ZJU/ZJU_3656.cpp

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
#include <cstdio>
2+
#include <cstring>
3+
#include <algorithm>
4+
5+
using namespace std;
6+
7+
const int N = 1010;
8+
9+
int b[N][N];
10+
bool ad[N][N];
11+
int scc, id[N];
12+
int n, nn;
13+
int low[N], vis[N];
14+
int stk[N], top;
15+
bool in_stack[N];
16+
int stamp;
17+
int nt[N];
18+
19+
void DFS (int u) {
20+
vis[u] = low[u] = ++stamp;
21+
in_stack [stk[++top] = u] = true;
22+
for (int i = 0; i < nn; ++i) {
23+
if (!ad[u][i]) continue;
24+
if (!vis[i]) {
25+
DFS (i);
26+
low[u] = min (low[i], low[u]);
27+
}
28+
else if (in_stack [i])
29+
low[u] = min (low[u], vis[i]);
30+
}
31+
if (low[u] != vis[u]) return;
32+
scc++;
33+
int i;
34+
do {
35+
i = stk[top--];
36+
id[i] = scc;
37+
in_stack[i] = false;
38+
}while (i != u);
39+
}
40+
41+
void calc_scc () {
42+
memset (vis, 0, sizeof (vis));
43+
memset (in_stack, false, sizeof (in_stack));
44+
scc = stamp = top = 0;
45+
for (int i = 0; i < nn; ++i)
46+
if (!vis[i]) DFS (i);
47+
}
48+
49+
inline void add_term (int x, int y) {
50+
ad[nt[x]][y] = true;
51+
ad[nt[y]][x] = true;
52+
}
53+
54+
bool chk (int bt) {
55+
memset (ad, false, sizeof (ad));
56+
nn = 1000;
57+
for (int i = 0; i < n; ++i)
58+
for (int j = i + 1; j < n; ++j) {
59+
if (i % 2 == 1 && j % 2 == 1) {
60+
if (b[i][j] & (1<<bt)) // i or j
61+
add_term (i, j);
62+
else {// ni and nj
63+
add_term (nt[i], nt[i]);
64+
add_term (nt[j], nt[j]);
65+
}
66+
}
67+
else if (i % 2 == 0 && j % 2 == 0) {
68+
if (b[i][j] & (1<<bt)) { // i and j
69+
add_term (i, i);
70+
add_term (j, j);
71+
}
72+
else { // nt (i) or nt (j)
73+
add_term (nt[i], nt[j]);
74+
}
75+
}
76+
else {
77+
if (b[i][j] & (1<<bt)) { // i ^ j = (i or j) and ( nt(i) or nt(j) )
78+
add_term (i, j);
79+
add_term (nt[i], nt[j]);
80+
}
81+
else { // (i or nt (j)) and (nt (i) or j)
82+
add_term (i, nt[j]);
83+
add_term (nt[i], j);
84+
}
85+
}
86+
}
87+
calc_scc ();
88+
for (int i = 0; i < n; ++i)
89+
if (id[i] == id[nt[i]])
90+
return false;
91+
// printf ("bit %d\n", bt);
92+
// for (int i = 0; i < n; ++i)
93+
// printf ("%d %d\n", id[i], id[nt[i]]);
94+
return true;
95+
}
96+
97+
int main () {
98+
int i, j, k;
99+
100+
for (i = 0; i < 1000; ++i)
101+
nt[i] = i >= 500 ? i - 500 : i + 500;
102+
103+
//freopen ("in", "r", stdin);
104+
while (scanf ("%d", &n) == 1) {
105+
bool flag = true;
106+
for (i = 0; i < n; ++i)
107+
for (j = 0; j < n; ++j) {
108+
scanf ("%d", &b[i][j]);
109+
if (i == j && b[i][j] != 0 || i > j && b[i][j] != b[j][i]) {
110+
flag = false;
111+
}
112+
}
113+
for (int bt = 0; flag && bt < 31; ++bt) {
114+
if (!chk (bt)) {
115+
flag = false;
116+
break;
117+
}
118+
}
119+
printf ("%s\n", flag ? "YES" : "NO");
120+
}
121+
return 0;
122+
}

0 commit comments

Comments
 (0)