2020年11月30号图论代码

A - 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
`#include

include <bits/stdc++.h>

using namespace std;
bool Map[105][105],vis[105];
void bfs(int k,int t)
{
queue q;
q.push(t);
vis[t]=true;
cout<<t;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<k;i++)
{
if(Map[x][i]&&!vis[i])
{
q.push(i);
vis[i]=true;
cout<<" "<<i;
}
}
}
cout<<endl;
}
int main()
{
ios::sync_with_stdio(false);
int n,k,m,t,u,v;
cin>>n;
while(n--)
{
memset(Map,false,sizeof(Map));
memset(vis,false,sizeof(vis));
cin>>k>>m>>t;
for(int i=0;i<m;i++)
{
cin>>u>>v;
Map[u][v]=Map[v][u]=true;
}
bfs(k,t);
}
return 0;
}B - 数据结构实验之图论二:图的深度遍历#include <bits/stdc++.h>
using namespace std;
int n,k,m,u,v;
bool Map[110][110],vis[110];
void dfs(int t)
{
if(t0)cout<<t;
else cout<<" "<<t;
vis[t]=true;
for(int i=0;i<k;i++)
{
if(Map[t][i]&&!vis[i])
{
dfs(i);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
while(n--)
{
memset(Map,false,sizeof(Map));
memset(vis,false,sizeof(vis));
cin>>k>>m;
for(int i=0;i<m;i++)
{
cin>>u>>v;
Map[u][v]=Map[v][u]=true;
}
dfs(0);
cout<<endl;
}
return 0;
}C - 数据结构实验之图论三:判断可达性#include <bits/stdc++.h>
using namespace std;
int n,m,a,b,flag;
bool Map[1010][1010],vis[1010];
void dfs(int t)
{
vis[t]=true;
for(int i=1;i<=n;i++)
{
if(Map[t][i]&&!vis[i])
{
if(i
1)flag=1;
dfs(i);
}
}
}
int main()
{
while(cin>>n>>m)
{
flag=0;
memset(Map,false,sizeof(Map));
memset(vis,false,sizeof(vis));
for(int i=0;i<m;i++)
{
cin>>a>>b;
Map[a][b]=true;
}
dfs(n);
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}D - 数据结构实验之图论四:迷宫探索#include <bits/stdc++.h>
using namespace std;
int t,n,m,s,u,v,path[1010],pa;
bool Map[1010][1010],vis[1010];
void dfs(int t)
{
vis[t]=true;
path[++pa]=t;
for(int i=1;i<=n;i++)
{
if(Map[t][i]&&!vis[i])
{
dfs(i);
path[++pa]=t;
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
pa=-1;
memset(Map,false,sizeof(Map));
memset(vis,false,sizeof(vis));
cin>>n>>m>>s;
for(int i=0;i<m;i++)
{
cin>>u>>v;
Map[u][v]=Map[v][u]=true;
}
dfs(s);
for(int i=0;i<=pa;i++)
if(ipa)
cout<<path[i];
else
cout<<path[i]<<" ";
if(2*n-1
pa+1)cout<<endl;
else cout<<" 0"<<endl;
}
return 0;
}E - 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)#include <bits/stdc++.h>
using namespace std;
bool Map[1010][1010],vis[1010];
int n,m,u,v,level[1010];
void bfs(int t)
{
int x;
queue q;
q.push(t);
vis[t]=true;
level[t]=0;
while(!q.empty())
{
x=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
if(Map[x][i]&&!vis[i])
{
q.push(i);
vis[i]=true;
level[i]=level[x]+1;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
memset(level,0,sizeof(level));
memset(Map,false,sizeof(Map));
memset(vis,false,sizeof(vis));
for(int i=0;i<m;i++)
{
cin>>u>>v;
Map[u][v]=true;
}
bfs(n);
if(level[1]==0)cout<<"NO"<<endl;
else cout<<level[1]<<endl;
}
return 0;
}F - 数据结构实验之图论六:村村通公路#include

include

include

include

include

include

include

include

include

using namespace std;
typedef long long LL;
const int N = 1e3 + 10, M = 3e3 + 10;
struct Edge {
int u, v, w;
bool operator<(const Edge &b) const { return w < b.w; }
} e[M];
int s[N], n, m, res;

int Find(int u) {
if (u == s[u]) return u;
return u = Find(s[u]);
}

bool judge() {
bool flag = false;
for (int i = 1; i <= n; i++)
if (s[i] == i) {
if (flag) return false;
flag = true;
}
return true;
}

int main() {
while (~scanf("%d %d", &n, &m)) {
for (int i = 1; i <= n; i++) s[i] = i;
for (int i = 1; i <= m; i++)
scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].w);
sort(e + 1, e + m + 1);
res = 0;
for (int i = 1; i <= m; i++) {
int u = Find(e[i].u);
int v = Find(e[i].v);
if (u != v) {
s[u] = v;
res += e[i].w;
}
}
if (!judge()) res = -1;
printf("%d\n", res);
}
return 0;
}`
I - 数据结构实验之图论九:最小生成树
`#include <bits/stdc++.h>
using namespace std;
int n,m,s[110];
struct edge
{
int u,v,w;
bool operator < (const edge &b) const {return w<b.w;}
}e[10010];
int Find(int u)
{
if(s[u]u)return u;
else return u=Find(s[u]);
}
bool judge()
{
bool flag=false;
for(int i=1;i<=n;i++)
{
if(s[i]
i)
if(flag)return false;
else flag=true;
}
return flag;
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
for(int i=1;i<=n;i++)
s[i]=i;//初始化节点的祖宗为自己;
for(int i=1;i<=m;i++)
cin>>e[i].u>>e[i].v>>e[i].w;//将边的信息加入结构体e中;
int res=0;//用res记录记录已加入的权值;
sort(e+1,e+1+m);//对边结构体数组e进行升序排序;
for(int i=1;i<=m;i++)//遍历e结构体数组,将不构成环的边的权值加入res;
{
int u=Find(e[i].u);
int v=Find(e[i].v);
if(u!=v)
{
s[u]=v;
res+=e[i].w;
}
}
//if(!judge())res=-1;//如果祖宗数组s有两个祖宗,即存在不能连通的点,用res赋值为-1表示;
cout<<res<<endl;
}
return 0;
}`

posted @ 2020-11-30 18:42  代码画师  阅读(77)  评论(0)    收藏  举报