图的存储(图论)
/* *所谓的这种存储边的方法,就是邻接链表在的静态实现(人称:池子法) *就是比较省时间开销 */#include <cstdio>#include <cstring>#define MAXM 1000005#define MAXN 10005struct node { int v, w, pre;}edge[MAXM<<1];int p[MAXN], nEdge; //p每个点相关边的起始位置,nEdge总共存储的边,双向的话为2*m,单向边为mint n, m;void connect(int u, int v) { //将边u->v加进边集 nEdge++; edge[nEdge].pre = p[u]; edge[nEdge].v = v; p[u] = nEdge;}int main() { while (scanf("%d%d", &n, &m) && n && m) { memset(p, 0, sizeof(p)); nEdge = 0; int u, v; for (int i=0; i<m; i++) { scanf("%d%d", &u, &v); connect(u, v); connect(v, u); } for (int i=1; i<=n; i++) { for (int j=p[i]; j; j=edge[j].pre) printf("%d ", edge[j].v); printf("\n"); } } return 0;}