问题:给出了一个无向图,其中包含节点数(n),边数(m)和节点之间的边。我需要使用 std :: map 确定它是否是树。
输入将如下所示: n m
然后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)
任何帮助将不胜感激,谢谢。
答案 0 :(得分:0)
好吧,我发现了什么问题。
问题是当图中存在循环和分离的节点时。它无法检测到它我尝试输入如下: 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;
}