第一节、深度与广度优先,究竟是指啥?(无向图)
p131 DFS遍历图
1 #include <stdio.h> 2 int book[101],sum,n,e[101][101]; 3 4 void dfs(int cur) 5 { 6 int i; 7 printf("%d ",cur); 8 sum++; 9 if(sum==n) return; 10 for(i=1;i<=n;i++) 11 { 12 if(e[cur][i]==1 && book[i]==0) 13 { 14 book[i]=1; 15 dfs(i); 16 } 17 } 18 return; 19 } 20 21 int main() 22 { 23 int i,j,m,a,b; 24 scanf("%d %d", &n, &m); 25 26 for(i = 1; i <= n; i++) 27 for(j = 1; j <= n; j++) 28 if(i==j) e[i][j]=0; 29 else e[i][j]=99999999; 30 31 for(i=1;i<=m;i++) 32 { 33 scanf("%d %d", &a, &b); 34 e[a][b]=1; 35 e[b][a]=1; 36 } 37 38 book[1]=1; 39 dfs(1); 40 getchar(); getchar(); 41 return 0; 42 } 43 44 /* 45 46 5 5 47 1 2 48 1 3 49 1 5 50 2 4 51 3 5 52 53 */
相关修改:sum木有必要有。
1 #include <stdio.h> 2 int book[101],n,e[101][101]; 3 4 void dfs(int cur) 5 { 6 int i; 7 printf("%d ",cur); 8 for(i=1;i<=n;i++) 9 { 10 if(e[cur][i]==1 && book[i]==0) 11 { 12 book[i]=1; 13 dfs(i); 14 } 15 } 16 return; 17 } 18 19 int main() 20 { 21 int i,j,m,a,b; 22 scanf("%d %d", &n, &m); 23 24 for(i = 1; i <= n; i++) 25 for(j = 1; j <= n; j++) 26 if(i==j) e[i][j]=0; 27 else e[i][j]=99999999; 28 29 for(i=1;i<=m;i++) 30 { 31 scanf("%d %d", &a, &b); 32 e[a][b]=1; 33 e[b][a]=1; 34 } 35 36 book[1]=1; 37 dfs(1); 38 getchar(); getchar(); 39 return 0; 40 } 41 42 /* 43 这组数据,使顶点四不连通 44 45 5 5 46 1 2 47 1 3 48 1 5 49 2 3 50 3 5 51 52 5 5 53 1 2 54 1 3 55 1 5 56 2 4 57 3 5 58 59 */
p134 BFS遍历图
1 #include <stdio.h> 2 int main() 3 { 4 int i,j,n,m,a,b,cur,book[101]={0},e[101][101]; 5 int que[10001],head,tail; 6 scanf("%d %d", &n, &m); 7 8 for(i = 1; i <= n; i++) 9 for(j = 1; j <= n; j++) 10 if(i==j) e[i][j]=0; 11 else e[i][j]=99999999; 12 13 for(i=1;i<=m;i++) 14 { 15 scanf("%d %d", &a, &b); 16 e[a][b]=1; 17 e[b][a]=1; 18 } 19 20 head=1; 21 tail=1; 22 23 que[tail]=1; 24 tail++; 25 book[1]=1; 26 27 while(head<tail) 28 { 29 cur=que[head]; 30 for(i=1;i<=n;i++) 31 { 32 if(e[cur][i]==1 && book[i]==0) 33 { 34 que[tail]=i; 35 tail++; 36 book[i]=1; 37 } 38 if(tail>n) break; 39 } 40 head++; 41 } 42 43 for(i=1;i<tail;i++) 44 printf("%d ",que[i]); 45 46 getchar(); getchar(); 47 return 0; 48 } 49 50 /* 51 52 5 5 53 1 2 54 1 3 55 1 5 56 2 4 57 3 5 58 59 */
第二节、城市地图——图的深度优先遍历(有向图)
p139 DFS求图中两顶点间的最短路径
1 #include <stdio.h> 2 int min=99999999, book[101], n, e[101][101]; 3 4 void dfs(int cur, int dis) 5 { 6 int i; 7 if(dis>min) return; 8 if(cur==n) 9 { 10 if(dis<min) min=dis; 11 return; 12 } 13 14 for(i=1;i<=n;i++) 15 { 16 if(e[cur][i] !=99999999 && book[i]==0) 17 { 18 book[i]=1; 19 dfs(i,dis+e[cur][i]); 20 book[i]=0; 21 } 22 } 23 return; 24 } 25 26 int main() 27 { 28 int i,j,m,a,b,c; 29 scanf("%d %d", &n, &m); 30 31 for(i = 1; i <= n; i++) 32 for(j = 1; j <= n; j++) 33 if(i==j) e[i][j]=0; 34 else e[i][j]=99999999; 35 36 for(i=1;i<=m;i++) 37 { 38 scanf("%d %d %d", &a, &b, &c); 39 e[a][b]=c; 40 } 41 42 book[1]=1; 43 dfs(1,0); 44 printf("%d",min); 45 46 getchar(); getchar(); 47 return 0; 48 } 49 50 /* 51 52 5 8 53 1 2 2 54 1 5 10 55 2 3 3 56 2 5 7 57 3 1 4 58 3 4 4 59 4 5 5 60 5 3 3 61 62 */
p141 相关修改:能计算任意两顶点间的最短路径
并可使有向图,成为无向图
1 #include <stdio.h> 2 int min=99999999, book[101], n, e[101][101]; 3 int start,end; // 4 5 void dfs(int cur, int dis) 6 { 7 int i; 8 if(dis>min) return; 9 if(cur==end) // 10 { 11 if(dis<min) min=dis; 12 return; 13 } 14 15 for(i=1;i<=n;i++) 16 { 17 if(e[cur][i] !=99999999 && book[i]==0) 18 { 19 book[i]=1; 20 dfs(i,dis+e[cur][i]); 21 book[i]=0; 22 } 23 } 24 return; 25 } 26 27 int main() 28 { 29 int i,j,m,a,b,c; 30 scanf("%d %d", &n, &m); 31 32 for(i = 1; i <= n; i++) 33 for(j = 1; j <= n; j++) 34 if(i==j) e[i][j]=0; 35 else e[i][j]=99999999; 36 37 for(i=1;i<=m;i++) 38 { 39 scanf("%d %d %d", &a, &b, &c); 40 e[a][b]=c; 41 //e[b][a]=c; //添加这句,使之成为无向图 p141 42 } 43 44 scanf("%d %d",&start,&end); //最后一行,输入起点与终点 45 book[start]=1; // 46 dfs(start,0); // 47 printf("%d",min); 48 49 getchar(); getchar(); 50 return 0; 51 } 52 53 /* 54 改编程序,使之能计算任意起点与终点间的最短路径 55 56 5 8 57 1 2 2 58 1 5 10 59 2 3 3 60 2 5 7 61 3 1 4 62 3 4 4 63 4 5 5 64 5 3 3 65 5 2 66 67 */
第三节、图的广度优先遍历
p144 广度优先求航班最少转机次数(设每边权值为1)
1 #include <stdio.h> 2 struct note 3 { 4 int x; //城市编号 5 int s; //转机次数 6 }; 7 8 int main() 9 { 10 struct note que[2501]; 11 int e[51][51]={0}, book[51]={0}; 12 int head,tail; 13 int i,j,n,m,a,b,cur,start,end,flag=0; 14 scanf("%d %d %d %d", &n, &m, &start, &end); 15 16 for(i = 1; i <= n; i++) 17 for(j = 1; j <= n; j++) 18 if(i==j) e[i][j]=0; 19 else e[i][j]=99999999; 20 21 for(i=1;i<=m;i++) 22 { 23 scanf("%d %d", &a, &b); 24 e[a][b]=1; 25 e[b][a]=1; 26 } 27 28 head=1; 29 tail=1; 30 31 que[tail].x=start; 32 que[tail].s=0; 33 tail++; 34 //book[1]=start; 35 book[start]=1; 36 37 while(head<tail) 38 { 39 cur=que[head].x; 40 for(i=1;i<=n;i++) 41 { 42 if(e[cur][i]!=99999999 && book[i]==0) 43 { 44 que[tail].x=i; 45 que[tail].s=que[head].s+1; 46 tail++; 47 book[i]=1; 48 } 49 if(que[tail-1].x==end) 50 { 51 flag=1; 52 break; 53 } 54 } 55 if(flag==1) break; 56 head++; 57 } 58 59 printf("%d ",que[tail-1].s); 60 61 getchar(); getchar(); 62 return 0; 63 } 64 65 /* 66 67 5 7 1 5 68 1 2 69 1 3 70 2 3 71 2 4 72 3 4 73 3 5 74 4 5 75 76 */
oj
以后整理。。。