找朋友
试题描述
|
老师要去统计班里的人际情况。 班里共有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 }