打印邻接表

时间:2019-02-07 14:14:21

标签: c++11 data-structures

我刚开始使用图形,并使用成对向量和unordered_map打印邻接表,尽管当我针对随机自定义输入测试代码时,它与预期结果匹配,但是当我将其提交给在线判断时,它给出了我是细分错误。

问题:

给出双向图的边“ E”和顶点“ V”的数量。您的任务是通过邻接表构建图形并为每个顶点打印邻接表。

输入:

输入的第一行是T,表示测试用例的数量。然后,每个T的第一行包含两个正整数V和E,其中``V''是顶点数,``E''是图中的边数。接下来,“ E”线包含两个正数,表示这两个顶点之间存在边。

输出:

对于每个顶点,请打印它们的连接节点,以便将其推入列表。

#include<iostream>
#include<unordered_map>
#include<vector>
#include<algorithm>
using namespace std;
int main()
 {
  int T;
  cin>>T;
  while(T--){
  int nv,ne;
  cin>>nv>>ne;
  vector<pair<int,int>> vect;
  for(int i=0;i<ne;i++)
{  int k,l;

    cin>>k>>l;vect.push_back( make_pair(k,l) );    
}
unordered_map<int,vector<int>> umap;
for(int i=0;i<ne;i++)
{
   umap[vect[i].first].push_back(vect[i].second);
    umap[vect[i].second].push_back(vect[i].first);
}
for(int i=0;i<nv;i++)
{
    sort(umap[i].begin(),umap[i].end());
}
int j=0;
for(int i=0;i<nv;i++)
{
   cout<<i<<"->"<<" ";
    for( j=0;j<umap[i].size()-1;j++)
    {
      cout<<umap[i][j]<<"->"<<" ";  
    }
    cout<<umap[i][j];
    cout<<"\n";
}
}
return 0;
}

示例:

输入:

1

5 7

0 1

0 4

1 2

1 3

1 4

2 3

3 4

输出:

0-> 1-> 4

1-> 0-> 2-> 3-> 4

2-> 1-> 3

3-> 1-> 2-> 4

4-> 0-> 1-> 3

1 个答案:

答案 0 :(得分:0)

“细分错误”是由于顶点没有边而引起的。在问题描述中,我没有看到所有顶点至少具有一条边的任何约束。例如,让我们考虑一下此输入。

1
3 1
0 1

此处顶点2没有任何边。让我们看一下打印循环中发生的情况。

for(int i=0;i<nv;i++)
{
   cout<<i<<"->"<<" ";
    for( j=0;j<umap[i].size()-1;j++)
    {
      cout<<umap[i][j]<<"->"<<" ";  
    }
    cout<<umap[i][j];
    cout<<"\n";
}
  1. umap[i].size()-1很危险:vector<T>::size()返回一个无符号整数。因此,如果大小为0,则为0-1,这会导致下溢
  2. 即使解决了第一个问题(类似(int)umap[i].size()-1),下面的行cout<<umap[i][j];也会尝试打印umap[i][0],如果大小为0,则该文本无效

所以我将更改如下代码:

for(int i=0;i<nv;i++)
{
  cout<<i;
  for( j=0;j<umap[i].size();j++)
  {
    cout<<"->"<<" "<<umap[i][j];
  }
  cout<<"\n";
}