构建生成树图

时间:2016-12-21 12:45:50

标签: c++

我需要构建图形的生成树并打印生成树和此边缘的边数。如果我们不能制作生成树,请使用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;
}

0 个答案:

没有答案