找朋友

试题描述

老师要去统计班里的人际情况。

班里共有n名同学,编号从1到n。班上共有m对朋友。

现在,老师希望快速地知道,每名同学都有哪些朋友。

输入
输入的第一行包含两个整数n, m。
接下来m行,每行2个正整数编号,表示这两名同学是朋友。
输出
输出共n行,第i行的格式为:Friends of i : i所有朋友的编号。注意后输入的朋友先输出,详见样例。
输入示例
6 5
1 2
1 6
4 5
1 4
5 6
输出示例
Friends of 1 : 4 6 2
Friends of 2 : 1
Friends of 3 :
Friends of 4 : 1 5
Friends of 5 : 6 4
Friends of 6 : 5 1
其他说明
对于40%的数据,n<=1000;
对于100%的数据,n<=100000,m<=200000。
 

这道题用了:邻接表。

head 1 2 3 4 5
初始化 -1 -1 -1 -1 -1
  0     2  
  1        
  3        
map 0 1 2 3 4
x 1 1 4 1 5
y 2 6 5 4 6
next -1 0 -1 1 -1

为了助于理解,此处给出一组模拟过程:

从2号点出发→map[5],next=3→map[3],next=1→map[1],next=-1;模拟结束

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 struct Edge   //结构体 
 6 {
 7     int x,y,next;
 8 }map[401010];  //由于是无向图,所以范围要 ×2 
 9 
10 int head[101010];
11 
12 void add_edge(int i,int x,int y)
13 {
14     map[i].x=x;
15     map[i].y=y;
16     map[i].next=head[x];
17     head[x]=i;
18 }
19 
20 int main()
21 {
22     int n,m;
23     scanf("%d%d",&n,&m);
24     for(int i=1;i<=n;i++) head[i]=-1;   //全部初始化为-1,方便后面找终点 
25     for(int i=0;i<m;i++)
26     {
27         int x,y;
28         scanf("%d%d",&x,&y);
29         add_edge(2*i,x,y);   //如果只写一个,建的是有向图
30         add_edge(2*i+1,y,x);   //为了不让后面的覆盖前面的,i的位置不能相同 
31     }
32     for(int i=1;i<=n;i++)
33     { 
34         cout<<"Friends of "<<i<<" :";
35         for(int j=head[i];j!=-1/*没到头*/;j=map[j].next/*找下一个点*/)   //遍历这个点的所有边,图论中常用!
36             cout<<" "<<map[j].y;
37         cout<<endl;
38     } 
39     //system("pause");
40     return 0;
41 }
找朋友
原文地址:https://www.cnblogs.com/YXY-1211/p/5703490.html