存图方法之邻接表和链式前向星

1.邻接表存图:

用vector即可

#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 1000 
vector<int > e[MAXN];//边 
vector<int > v[MAXN];//终点 
int main()
{
	int n;
	int a,b,c;
	while(~scanf("%d",&n))
	{
		while(n--)
		{
			scanf("%d %d %d",&a ,&b ,&c);
			e[a].push_back(c);//有向
			v[a].push_back(b); 
			//e[b].push_back(c);
			//v[b].push_back(a);//无向 
		}
		for(int j=0 ; j<e[1].size() ; j++)
			printf("1->%d %d\n",v[1][j],e[1][j]);
	}
	return 0;
}  

2.链式前向星:

详解见:https://blog.csdn.net/acdreamers/article/details/16902023

#include<bits/stdc++.h>
using namespace std;
#define MAXN 10005
struct Edge{
	int next;//同起点的上一条边的位置 
	int e;//这条边的终点 
	int w;//边的权值 
};
Edge edge[MAXN];
int head[MAXN];//head[i]表示以i为起点的最后一条边的储存位置
int cnt;//cnt从1开始 
void add(int u,int v,int w){
	edge[cnt].e=v;
	edge[cnt].w=w;
	edge[cnt].next=head[u]; 
	head[u]=cnt++;
}
int main()
{
	int n,m;
	int u,v,w; 
	while(~scanf("%d %d",&n,&m))
	{
		cnt=1;
		memset(head,-1,sizeof(head));//将head初始化 
		for(int i=0 ; i<n ;i++){
			scanf("%d %d %d",&u,&v,&w);
			add(u,v,w);
		}
		if(head[m]==-1)	printf("不存在\n"); 
		for(int i=head[m] ; i>0 ; i=edge[i].next)
			printf("%d->%d %d\n",m,edge[i].e,edge[i].w);//输出以m为起点的边 
	}
	return 0;
}
/*
7 3
1 2 4
1 3 5
2 4 6
3 5 7
2 6 4
4 5 6
3 2 1
*/

猜你喜欢

转载自blog.csdn.net/l_i_n_q_i_n_g/article/details/81315513
今日推荐