【问题标题】:determining if a graph is a tree using map使用 map 确定图是否为树
【发布时间】:2013-04-29 16:18:49
【问题描述】:

问题:我得到一个无向图,其中包含节点数(n)、边数(m)和节点之间的边。我需要使用 std::map 来确定它是否是一棵树。

输入将是这样的: 米

然后 m 行描述节点之间的边

所以我尝试了以下方法:

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,int> Links;
    int n,m,Parent,Child;

    cin>>n>>m;
    if(m!=n-1) //First Condition -> Number of Links=Number of Nodes-1 -> No loops && No Cuts
    {
        cout<<"NO"<<endl;
        return 0;
    }
    while(m!=0)
    {
        m--;
        cin>>Parent>>Child;


        if(Links[Child]!=0)
        {
            if(Links[Parent]!=0) //No node has more than one parent
            {
                cout<<"NO"<<endl;
                return 0;
            }
            Links[Parent]=Child;
        }
        else
        Links[Child]=Parent;

    }
    cout<<"YES"<<endl;

    return 0;
}

但它只是产生错误的答案,我不知道为什么(我在这个在线法官的问题上测试过它A similar problem on SPOJ

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 你的算法是错误的。例如 1->2, 2->3, 3->1 不是树,因为它有一个循环,但您的代码会打印 YES。要测试一个图是否是一棵树,你需要寻找循环,如果一个图有一个循环,它就不是一棵树。这是一个比您拥有的更复杂的算法。在网上查一下,我相信你能找到例子。
  • 它将打印 NO,因为您必须在输入这些输入之前先输入节点和边的数量,因此第一行中的输入将是:3 3,我将检查是否为“3(m here) !=3(n here)-1" 这是真的,所以在你尝试输入图表之前它会打印 NO ...而且我认为我不需要在这里检查循环,因为如果有循环,则必须是比预期的一个或多个边(即:m!= n-1)或图中其他地方的切割,我认为这两个条件“m == n-1”和“没有节点有多个父节点”足以指出这一点。
  • 是的,你是对的,我误解了你的算法

标签: c++ graph map tree


【解决方案1】:

好的,我发现了问题所在。

问题是当图中存在循环和分离节点时。它无法检测到它们我尝试输入如下: 5 4 1 2 3 1 2 4 4 3 这是一个带有循环和分离节点的图,它输出“YES” 但如果我以这种方式输入它,它会输出“NO”: 5 4 1 2 1 3 2 4 3 4 所以一般来说,我需要检查图表中的切口。

编辑:我改变了这个想法,它现在按预期工作:

#include <iostream>
#include <map>

using namespace std;

int main()
{
    map<int,bool> Links;
    int n,m,N1,N2;

    cin>>n>>m;
    if(m!=n-1) //First Condition: Number of Links=Number of Nodes-1 
    {
        cout<<"NO"<<endl;
        return 0;
    }
    while(m!=0)
    {
        m--;
        cin>>N1>>N2;

        if(Links[N1] && Links[N2]) //Asumming the graph is given as it builds
        {
            cout<<"NO"<<endl;
            return 0;
        }
       Links[N1]=1;
       Links[N2]=1;
    }


    cout<<"YES"<<endl;

    return 0;
}

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多