洛谷B3613 图的存储与出边的排序 题解

这是一道很简单的图的遍历题目,看到很多用数组与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;
}

本人是个新手,如有不足处,还请指出!

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值