const int maxv = 1000;
const int maxe = 5000;
const int maxn = 1000;
/*
* 邻接矩阵
*
*/
struct adjMetrix {
int G[maxn+10][maxn+10];
int visit[maxn]; //标记点访问与否
int n;
void addedge(int u, int v) {
G[u][v] = 1;
return ;
}
void read() {
memset(G, 0, sizeof(G));
memset(visit, 0, sizeof(visit));
int u, v, w;
scanf("%d", &n);
for (int i=0; i<n; i++) {
scanf("%d %d", &u, &v);
addedge(u, v);
}
return ;
}
void dfs(int i) {
for (int j=0; j<=n; j++) {
if (G[i][j]!=0 && visit[j]==0) {
printf("%d %d\n", i, j);
visit[j] = 1;
dfs(j);
}
}
}
};
/*
* 邻接链表
*
*/
struct Edge {
int to, w, next;
};
struct adjTable {
int node[maxv];
int visit[maxe];
int cnt;
struct Edge e[maxe];
void init() {
memset(node, -1, sizeof(node));
memset(visit, 0, sizeof(visit));
cnt = 0;
}
void addedge(int u,int v) {
e[cnt].to = v;
e[cnt].next = node[u];
node[u] = cnt++;
}
void read() {
int n, u, v, w;
scanf("%d", &n);
for (int i=1; i<=n; i++) {
scanf("%d %d", &u, &v);
addedge(u, v);
}
return ;
}
void dfs(int p) {
int i;
for (i=node[p]; i!=-1; i=e[i].next) {
if (visit[ e[i].to ] == 0) { //如果下一条边的指向点未被访问过
printf("%d %d\n", p, e[i].to);
visit[ p ] = 1; //标记当前点已被访问
dfs( e[i].to );
}
}
}
};