我需要构建图形的生成树并打印生成树和此边缘的边数。如果我们不能制作生成树,请使用cin -1
例如
输入
0 1 0
1 0 1
0 1 0
输出
2
1 2
3 2
输入
0 0
0 0
输出
-1
我使用了dfs,但这项工作非常糟糕
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
using namespace std;
typedef pair<int, int>IntPair;
vector<vector<int>>g;
vector<bool>mark;
vector<IntPair>ostov;
int n;
int cc = 0;
ifstream fin("input.txt");
ofstream fout("output.txt");
void dfs(int v)
{
if (mark[v])
return;
if (!mark[v])
{
mark[v] = true;
}
for (int i = 0; i < g[v].size(); i++)
{
int w = g[v][i];
mark[g[i][v]] = true;
if (w == 1 && v!=w)
{
cc++;
ostov.push_back(make_pair(v + 1, w + 1));
}
dfs(w);
}
}
int main()
{
int a;
bool check = false;
fin >> n;
g.resize(n);
mark.assign(n, false);
for (int i = 0; i < g.size(); i++)
{
for (int j = 0; j < n; j++)
{
fin >> a;
g[i].push_back(a);
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
check = false;
if (g[i][j] == 1)
{
check = true;
break;
}
}
if (!check)
{
fout << "-1";
return 0;
}
}
bool c1 = false;
for (int i = 0; i < n; i++)
dfs(i);
fout << cc << endl;
for (int i = 0; i < ostov.size(); i++)
{
if (c1)
{
fout << endl;
}
c1 = true;
fout << ostov[i].first << " " << ostov[i].second;
}
return 0;
}