数据结构(图、查找) 发表于 2018-03-14 | 分类于 数据结构 广度优先遍历123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#include <bits/stdc++.h>#define maxsize 1000using namespace std;int maps[maxsize][maxsize];int vis[maxsize];int ans[maxsize]; //用来保存遍历的结果;int p;int k,m,t; //m边,k顶点,t遍历的起始位置void bfs(int t,int n){ queue <int> q; vis[t]=1; ans[p++]=t; q.push(t); while(!q.empty()) { int v=q.front(); q.pop(); for(int i=0;i<n;i++) { if(!vis[i]&&maps[v][i]) { vis[i]=1; ans[p++]=i; q.push(i); } } }}int main(){ int T,i,u,v; cin>>T; while(T--) { cin>>k>>m>>t; memset(maps,0,sizeof(maps)); memset(vis,0,sizeof(vis)); for(i=0;i<m;i++) { cin>>u>>v; maps[u][v]=1; maps[v][u]=1; } bfs(t,k); for(int i=0;i<p;i++) cout<<ans[i]<<" "; p=0; }} 图的深度遍历123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990#include<bits/stdc++.h> using namespace std; int vis[105], a[105][105]; int k, m; void dfs(int i) { int j; for(j = 0; j < k; j++) { if(a[i][j]==1&&vis[j]==0) { printf(" %d", j); vis[j] = 1; dfs(j); } } } int main() { int i, n, u, x, y; scanf("%d", &n); while(n--) { scanf("%d%d", &k, &m); memset(vis, 0, sizeof(vis)); memset(a, 0, sizeof(a)); for(i = 0; i < m; i++) { scanf("%d%d", &x, &y); a[x][y] = a[y][x] = 1; if(i==0) u = x; } cout<<u; vis[u] = 1; dfs(u); cout<<endl; } } printf(" %d",j); vis[j]=1; dfs(j); } }}``` ### 最短路径``` bashvoid prim(){ memset(vis,false,sizeof(vis)); int mm; int i,j; for(i=1;i<=n;i++) { dis[i]=mp[1][j]; } vis[1]=true; int pos; for(i=1;i<n;i++) { mm=inf; for(j=1;j<=n;j++) { if(!vis[j]&&mm>dis[j]) { mm=dis[j]; pos=j; } } if(mm==inf) { cout<<"这是一个孤立的位置,没有与任何村庄相同\n"; } sum+=mm; vis[pos]=true; for(j=1;j<=n;j++) { if(!vis[j]&&dis[j]>mp[pos][j]) { dis[j]=mp[pos][j]; } } }} 二分查找12345678910111213141516171819202122232425262728293031323334353637383940#include <bits/stdc++.h>#define maxsize 1000using namespace std;int paixu(int *a,int l,int r,int key){ while(l<=r) { int mid=(l+r)/2; if(a[mid]<key) { l=mid+1; } else if(a[mid]>key) { r=mid-1; } else return mid; } return -1;}int main(){ int n,m; cin>>n>>m; int a[maxsize]; for(int i=0;i<n;i++) { cin>>a[i]; } while(m--) { int key; cin>>key; int flag=paixu(a,0,n-1,key); cout<<flag<<endl; }}