#include #include #include #define INFINITY 1000000000 typedef struct _node { int nbr; struct _node *next; } node; typedef node **graph; typedef struct { int vertex; int level; } qnode; typedef qnode *queue; graph gengraph ( int n, int m, int n1, int n2 ) { graph G; int u, v, e; node *p; G = (node **)malloc(n * sizeof(node *)); for (u=0; u= n-n2)) continue; if ((v < n1) && (u >= n-n2)) continue; p = G[u]; while (p) { if (p -> nbr == v) break; p = p -> next; } if (p) continue; p = (node *)malloc(sizeof(node)); p -> nbr = v; p -> next = G[u]; G[u] = p; p = (node *)malloc(sizeof(node)); p -> nbr = u; p -> next = G[v]; G[v] = p; ++e; printf("%2d %-2d", u, v); if (e % 10) printf("\t"); else printf("\n"); } if (e % 10) printf("\n"); return G; } void prngraph ( graph G, int n ) { int u, first; node *p; for (u=0; u ", u); p = G[u]; first = 1; while (p) { if (!first) printf(", "); first = 0; printf("%2d", p -> nbr); p = p -> next; } printf("\n"); } } void destroygraph ( graph G, int n ) { int u; node *p, *q; for (u=0; u next; free(p); p = q; } } free(G); } int BFS ( graph G, int n, int u, int n2 ) { queue Q; int F, B; int *visited; int v, w, l; node *p; Q = (qnode *)malloc(n * sizeof(qnode)); Q[0] = (qnode){u,0}; F = B = 0; visited = (int *)malloc(n * sizeof(int)); for (v=0; v= n-n2) { free(Q); free(visited); return l; } p = G[v]; while (p) { w = p -> nbr; if (!visited[w]) { ++B; Q[B].vertex = w; Q[B].level = l+1; visited[w] = 1; } p = p -> next; } } free(Q); free(visited); return INFINITY; } void getdist1 ( graph G, int n, int n1, int n2 ) { int u, d, l; d = INFINITY; for (u=0; u nbr; p = p -> next; if (u > v) continue; if (u < n1) { if (v >= n-n2) V1nbr[n-1] = 1; /* Case 6 */ else if (v >= n1) V1nbr[v] = 1; /* Case 4 */ } else if (v >= n-n2) { if ((u >= n1) && (u < n-n2)) V2nbr[u] = 1; /* Case 5 */ } else { /* Case 3 */ q = (node *)malloc(sizeof(node)); q -> nbr = v; q -> next = H[u]; H[u] = q; q = (node *)malloc(sizeof(node)); q -> nbr = u; q -> next = H[v]; H[v] = q; } } } /* Add the representative edges from V1 */ for (u=n1; u nbr = u; q -> next = H[0]; H[0] = q; q = (node *)malloc(sizeof(node)); q -> nbr = 0; q -> next = H[u]; H[u] = q; } } free(V1nbr); /* Add the representative edges from V2 */ for (u=n1; u nbr = u; q -> next = H[n-1]; H[n-1] = q; q = (node *)malloc(sizeof(node)); q -> nbr = n-1; q -> next = H[u]; H[u] = q; } } free(V2nbr); printf("\n--- The contracted graph\n"); prngraph(H,n); d = BFS(H,n,0,n2); printf("\n--- d(V1,V2) = %d\n", d); destroygraph(H,n); } int main ( int argc, char *argv[] ) { int n, m, n1, n2; graph G; if (argc >= 5) { n = atoi(argv[1]); m = atoi(argv[2]); n1 = atoi(argv[3]); n2 = atoi(argv[4]); } else { scanf("%d%d%d%d", &n, &m, &n1, &n2); } printf("n = %d\nm = %d\nn1 = %d\nn2 = %d\n", n, m, n1, n2); srand((unsigned int)time(NULL)); G = gengraph(n,m,n1,n2); printf("\n+++ The constructed graph\n"); prngraph(G,n); printf("\n+++ Method 1\n\n"); getdist1(G,n,n1,n2); printf("\n+++ Method 2\n"); getdist2(G,n,n1,n2); destroygraph(G,n); exit(0); }