图的基本存储的基本方式一
Description
解决图论问题,首先就要思考用什么样的方式存储图。但是小鑫却怎么也弄不明白如何存图才能有利于解决问题。你能帮他解决这个问题么?
Input
多组输入,到文件结尾。
每一组第一行有两个数n、m表示n个点,m条有向边。接下来有m行,每行两个数u、v代表u到v有一条有向边。第m+2行有一个数q代表询问次数,接下来q行每行有一个询问,输入两个数为a,b。
注意:点的编号为0~n-1,2<=n<=5000 ,n*(n-1)/2<=m<=n*(n-1),0<=q<=1000000,a!=b,输入保证没有自环和重边
Output
对于每一条询问,输出一行。若a到b可以直接连通输出Yes,否则输出No。
Sample
Input
2 1 0 1 2 0 1 1 0
Output
Yes No
1 #include <stdio.h> 2 #include<stdbool.h> 3 #include <stdlib.h> 4 #include<string.h> 5 bool a[5001][5001]; // 用int会超时 6 7 int main() 8 { 9 int n,m,i; 10 while ( ~scanf("%d %d",&n,&m) ) { 11 int x,y; 12 memset(a, 0, sizeof(a)); // 将二维数组a初始化为0 13 for ( i=0; i<m; i++ ) { 14 scanf("%d %d",&x,&y); 15 a[x][y] = 1; 16 } 17 18 int list; 19 scanf("%d",&list); 20 for ( i=0; i<list; i++ ) { 21 scanf("%d %d",&x,&y); 22 if ( a[x][y]==1 ) { 23 printf("Yes "); 24 } 25 else { 26 printf("No "); 27 } 28 } 29 } 30 31 return 0; 32 }
邻接矩阵
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 _Bool a[111][111]; 5 _Bool visit[111]; 6 int b[111]; 7 int in = 1, out = 0; 8 void bfs(int t, int k) 9 { 10 visit[t] = 1; 11 int i; 12 out++; 13 for(i = 0; i < k; i++) 14 { 15 if(!visit[i] && a[t][i]) 16 { 17 b[in++] = i; 18 visit[i] = 1; 19 } 20 } 21 if(out <= in) 22 bfs(b[out], k); 23 24 } 25 int main() 26 { 27 int n, k, m, t, u, v, i; 28 scanf("%d", &n); 29 while(n--) 30 { 31 memset(a, 0, sizeof(a)); 32 memset(visit, 0, sizeof(visit)); 33 memset(b, 0, sizeof(b)); 34 scanf("%d%d%d", &k, &m, &t); 35 for(i = 0; i < m; i++) 36 { 37 scanf("%d%d", &u, &v); 38 a[u][v] = 1; 39 a[v][u] = 1; 40 } 41 bfs(t, k); 42 printf("%d ", t); 43 for(i = 1; i < k; i++) 44 printf("%d%c", b[i], i == in-1? ' ' : ' '); 45 } 46 return 0; 47 }