我刚开始使用图形,并使用成对向量和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
答案 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";
}
umap[i].size()-1
很危险:vector<T>::size()
返回一个无符号整数。因此,如果大小为0,则为0-1
,这会导致下溢(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";
}