Posted: Tue May 09, 2006 9:44 pm
I see you use DFS, but it's better to switch to Union-find, really.
Code: Select all
1
10
c 2 5
q 2 5
Code: Select all
removed
Code: Select all
2
2
c 1 2
q 1 2
3
c 1 3
q 1 2
Code: Select all
1
9
c 3 9
c 1 6
c 4 8
c 3 2
c 3 8
c 5 7
c 6 2
c 5 4
q 9 1
q 4 8
Code: Select all
2,0
Code: Select all
#include <stdio.h>
#define max 1000
int m[max][max], d[max];
int fila[max], inicio, fim;
int suc, unsuc;
void adiciona(int a, int b) {
int i;
for (i = 1; i <= m[a][0]; i++)
if (m[a][i] == b) break;
if (i = m[a][0]+1) {
m[a][++m[a][0]] = b;
m[b][++m[b][0]] = a;
}
}
void colocanafila(int n) {
fila[fim++] = n;
if (fim > (max-1)) fim = 0;
}
int retiradafila() {
int ret;
if (inicio == fim) ret = -1;
else ret = fila[inicio++];
if (inicio > (max-1)) inicio = 0;
return ret;
}
void bfs(int a, int b) {
int i, w;
memset(d, -1, sizeof(d));
d[a] = 1;
inicio = fim = 0;
w = a;
while (w != -1) {
for(i = 1; i <= m[w][0]; i++) {
if (d[m[w][i]] == -1) {
if (m[w][i] == b) {
suc++;
w = 0;
break;
}
else {
d[m[w][i]] = 1;
colocanafila(m[w][i]);
}
}
}
if (!w) break;
w = retiradafila();
}
if (w == -1) unsuc++;
}
int main()
{
int t, n, q, w, first=1;
int ci, cj;
char tipo[2];
scanf("%d", &t);
while (t) {
if (first) first = 0;
else printf("\n");
t--;
memset(m, 0, sizeof(m));
suc = unsuc = 0;
scanf("%d", &n);
while (scanf("%s %d %d\n", tipo, &ci, &cj) == 3) {
switch (tipo[0]) {
case 'c': adiciona(ci, cj); break;
case 'q': bfs(ci, cj); break;
}
}
printf("%d,%d\n", suc, unsuc);
}
return 0;
}
Code: Select all
#define max 200
Code: Select all
1
1
q 1 1
Code: Select all
CODE REMOVED