这是一道很简单的图的遍历题目,看到很多用数组与set存储图,我就想用二维map做一个
题目描述:
给定一个 𝑛n 个点 𝑚m 条边的有向图 𝐺G,结点编号从 11 至 𝑛n。对于 𝑢=1,2,3,…𝑛u=1,2,3,…n,依次完成如下要求:
对于 𝑢u 的所有出边(即从 𝑢u 出发的边),按照从小到大的顺序输出出边所指向的节点编号。
依次完成的含义是,先按顺序输出 𝑢=1u=1 的出边所指向的点的编号,再按顺序输出 𝑢=2u=2 的出边所指向的点的编号……最后按顺序输出 𝑢=𝑛u=n 的出边所指向
输入格式
本题单测试点内有多组数据。
数据的第一行是一个整数 𝑇T,表示数据的组数。
对于每组数据的格式如下:
每组数据的第一行是两个整数,分别表示点的个数 𝑛n 和边的个数 𝑚m。
接下来 𝑚m 行,每行两个整数 𝑢,𝑣u,v,表示一条由 𝑢u 指向 𝑣v 的边。
保证每组数据内不存在重边。
输出格式
对于每组数据:
输出 𝑛n 行,每行若干个用空格隔开的整数。第 𝑖i 行输出节点 𝑖i 的出边所指向的节点编号。
注意,如果一个结点不存在出边,你同样需要输出一个空行。
的点的编号。
输入 #1
2 3 4 1 3 1 2 3 2 3 1 3 9 1 3 2 3 3 3 1 2 2 2 3 2 1 1 2 1 3 1
输出 #1
2 3 1 2 1 2 3 1 2 3 1 2 3
数据规模与约定:
对于全部的测试点,保证 1≤𝑇,𝑛,𝑚≤5×1051≤T,n,m≤5×105,但同时各测试点的 𝑛n 与 𝑚m 之和均不超过 5×1055×105,即 ∑𝑛,∑𝑚≤5×105∑n,∑m≤5×105。且 1≤𝑢,𝑣≤𝑛1≤u,v≤n,每组数据内不存在重边。
用二维map存图,利用map下标自身有序的存储特性,不需要排序,省空间与时间,题解如下:
#include<bits/stdc++.h>
using namespace std;
long long n,m,h,g,d,s,e,w,x,y;
map<long long, map<long long,long long> >a;
map<long long, map<long long,long long> >::iterator it1;
map<long long,long long>::iterator it2;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
a[i][0]=0;
}
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&x,&y);
a[x][y]=2;
a[x][0]=1;
}
for(int i=1;i<=n;i++)
{
//if(i==m)break;
for(it2=a[i].begin();it2!=a[i].end();it2++)
{
if(it2->second==0)break;
if(it2->second==1)continue;
printf("%lld ",it2->first);
}
cout<<"\n";
}
return 0;
}
本人是个新手,如有不足处,还请指出!