大致思路:
对于已经找到的 x,y 在矩阵中进行行遍历和列遍历。遇到存在的边则进行BFS或DFS
代码:
p.s 代码中均是以无向图为例
BFS
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
typedef struct{
int x,y;
}Node;
int mp[maxn][maxn];
queue<Node> q;
void bfs(int x,int y,int n)
{
int cnt=1;
Node a;
a.x=x;a.y=y;
q.push({x,y});
while(!q.empty())
{
Node b=q.front();
q.pop();
for(int i=1;i<=n;++i){//行遍历和列遍历
if(mp[b.x][i]){
q.push({b.x,i});
mp[b.x][i]=0;//及时标记
mp[i][b.x]=0;
cnt++;
}
if(mp[i][b.y]){
q.push({i,b.y});
mp[i][b.y]=0;
mp[b.y][i]=0;
cnt++;
}
}
}
cout<<cnt<<endl;
}
void print(int n)
{
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)
cout<<mp[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
cin>>mp[i][j];
bool flag=false;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(mp[i][j]){
mp[j][i]=0;
mp[i][j]=0;
bfs(i,j,n);
flag=true;
break;
}
}
if(flag)
break;
}
print(n);
return 0;
}
DFS
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
int mp[maxn][maxn],cnt;
void dfs(int x,int y,int n)
{
for(int i=1;i<=n;++i){
if(mp[i][y]){
mp[y][i]=0;
mp[i][y]=0;
cnt++;
dfs(i,y,n);
}
if(mp[x][i]){
mp[x][i]=0;
mp[i][x]=0;
cnt++;
dfs(x,i,n);
}
}
}
void print(int n)
{
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)
cout<<mp[i][j]<<" ";
cout<<endl;
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
cin>>mp[i][j];
bool flag=false;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(mp[i][j]){
cnt=1;
mp[j][i]=0;
mp[i][j]=0;
dfs(i,j,n);
flag=true;
break;
}
}
if(flag)
break;
}
cout<<cnt<<endl;
print(n);
return 0;
}