深度搜索
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 const int inf=0x3f3f3f3f; 7 int m,n,sum=0; 8 int ma[10][15]; 9 int vis[10]; 10 void dfs(int temp) 11 { 12 cout<<temp<<" "; 13 sum++; 14 vis[temp]=1; 15 if(sum==n)return ;//当所有的店都遍历完成的时候直接退出 16 for(int i=1;i<=n;i++){ 17 if(ma[temp][i]==1&&vis[i]==0) 18 dfs(i); 19 } 20 21 } 22 int main() 23 { 24 while(cin>>n>>m){ 25 memset(vis,0,sizeof(vis)); 26 //memset(ma,inf,sizeof(vis)); 27 for(int i=1;i<=n;i++){ 28 for(int j=1;j<=n;j++){ 29 if(i==j)ma[i][j]=0; 30 else ma[i][j]=inf; 31 } 32 } 33 int a,b,c; 34 for(int i=0;i<m;i++){ 35 cin>>a>>b; 36 ma[a][b]=ma[b][a]=1;//标记改点是可以连通的 37 } 38 vis[1]=1; 39 dfs(1);//从1开始遍历 40 } 41 }
广度搜索
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<queue> 6 using namespace std; 7 const int inf=0x3f3f3f3f; 8 int m,n,sum=0; 9 int ma[10][15]; 10 int vis[10]; 11 12 int main() 13 { 14 while(cin>>n>>m) 15 { 16 queue<int>que; 17 int temp,now; 18 memset(vis,0,sizeof(vis)); 19 //memset(ma,inf,sizeof(vis)); 20 for(int i=1; i<=n; i++) 21 { 22 for(int j=1; j<=n; j++) 23 { 24 if(i==j)ma[i][j]=0; 25 else ma[i][j]=inf; 26 } 27 } 28 int a,b; 29 for(int i=1; i<=m; i++) 30 { 31 cin>>a>>b; 32 ma[a][b]=ma[b][a]=1; 33 } 34 que.push(1); 35 int sum=0; 36 while(!que.empty()) 37 { 38 39 if(sum==n)break; 40 sum++; 41 cout<<que.front()<<" "; 42 now=que.front(); 43 vis[now]=1; 44 que.pop(); 45 for(int i=1; i<=n; i++) 46 { 47 if(ma[now][i]==1&&vis[i]==0) 48 { 49 que.push(i); 50 } 51 52 } 53 } 54 } 55 }
给出n个点m条边,对于接下来的m行,每行输入a,b,c三个数字,代表可以从a走到b并且这段路程是c的长度,现在问你从1号城市到达5号城市要走的最短路程。
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 const int inf=0x3f3f3f3f; 7 int minn=0x3f3f3f3f; 8 int ma[1005][1005],vis[1005]; 9 int m,n,a,b,c; 10 void dfs(int temp,int dis){ 11 12 if(dis>minn)return; 13 if(temp==n) 14 {if(dis<minn){ 15 minn=dis; 16 return; 17 } 18 } 19 for(int i=1;i<=n;i++){ 20 if(ma[temp][i]!=0x3f3f3f3f&&vis[i]==0){ 21 vis[i]=1; 22 dfs(i,dis+ma[temp][i]); 23 vis[i]=0;//****************这里非诚重要,当不可以再搜索的时候我们要退回来,就要去掉标记,因为再下一次的查找中可能还会用到这个点 24 } 25 } 26 return ; 27 } 28 int main(){ 29 while(cin>>n>>m){ 30 memset(vis,0,sizeof(vis)); 31 for(int i=1;i<=n;i++) 32 for(int j=1;j<=n;j++) 33 { 34 35 if(i==j)ma[i][j]=0; 36 else ma[i][j]=inf; 37 } 38 for(int i=0;i<m;i++){ 39 cin>>a>>b>>c; 40 ma[a][b]=c; 41 } 42 vis[1]=1; 43 dfs(1,0); 44 cout<<minn<<endl; 45 //cout<<0x3f3f3f3f; 46 } 47 } 48 49 /* 50 5 8 51 1 2 2 52 1 5 10 53 2 3 3 54 2 5 7 55 3 1 4 56 3 4 4 57 4 5 5 58 5 3 3 59 9 60 */