数据结构(图、查找)

广度优先遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <bits/stdc++.h>
#define maxsize 1000
using 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;
}
}

图的深度遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#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);
}
}
}
```
### 最短路径
``` bash
void 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];
}
}
}
}

二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <bits/stdc++.h>
#define maxsize 1000
using 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;
}
}
Fork me on GitHub