博客
关于我
vector构建邻接表和原始邻接表
阅读量:288 次
发布时间:2019-03-03

本文共 3177 字,大约阅读时间需要 10 分钟。

菜鸟生成记(47)

有时候真的不是别人代码写的晦涩难懂,而是我的知识储备太少;时隔2个月蒻羁终于会理解vector邻接表了;

先写个普通的邻接表构造和遍历!

#include<bits/stdc++.h>using namespace std;#define N 100000typedef struct st{       int to;//结点编号     int w;//权值     struct st *nx;//结点指针(指向下一个结点) }ll,*link;//类型 struct sx{       ll *next;//表头后面跟的结点 }s[N];//邻接表的表头 int n;int book[N]={   0};//标记数组 void dfs(int x){   	cout<<x<<" ";    link p;    p=s[x].next;   	book[x]=1;   	while(p)   	{      		if(book[p->to]==0)		{   			book[p->to]=1;			dfs(p->to);		}		p=p->nx;		}    return;}void bfs(int x){       link p;    int q[N];    int r=0,f=0;   	book[x]=1;   	cout<<x<<" ";   	q[r++]=x;   	while(r!=f)   	{      		int t=q[f++];   		p=s[t].next;   		while(p)   		{      			if(book[p->to]==0)   			{      				cout<<p->to<<" ";   				book[p->to]=1;				q[r++]=p->to;				}   			p=p->nx;			}	}    return;}void add(int from,int to,int w)//前插建表 {   	link p;    p=new ll;//结点分配空间     p->to=to;//from后面的结点编号     p->w=w;//from到to的权值     p->nx=s[from].next;    s[from].next=p;}/*//from:to:权值 5 1  2  2 1  3  1 2  4  5 2  5  4 */int main(){       int w;    int from,to;    link p;    cin>>n;    for(int i=1;i<=n;i++)    {   //表头指针域赋空         s[i].next=NULL;    }    for(int i=1;i<=n-1;i++)    {           scanf("%d%d%d",&from,&to,&w);        add(from,to,w);        add(to,from,w);    }    cout<<"邻接表"<<endl;    for(int i=1;i<=n;i++)    {       	cout<<'['<<i<<']'<<" ";    	link p=s[i].next;    	while(p)    	{       		cout<<p->to<<" ";			p=p->nx;		}		cout<<endl;	}    cout<<"深搜遍历序列"<<endl;    dfs(1);//从编号为1的结点开始遍历     cout<<endl;    memset(book,0,sizeof(book));//标记数组置空     cout<<"广搜遍历序列"<<endl;    bfs(1);//从编号为1的结点开始遍历    return 0;}

vector构造邻接表和遍历

#include<bits/stdc++.h>//vecotr构造邻接表 using namespace std;#define N 100000struct st{       int to;//结点编号     int w;//权值 };//类型 vector<st> s[N];//定义容器 int n;int book[N]={   0};void dfs(int x){   	book[x]=1;	cout<<x<<" ";    vector<st>::iterator it;    //迭代器法     /*it=s[x].begin();//结点x的邻接的第一个结点     while(it!=s[x].end())//到达容器的尾部     {    	if(book[it->to]==0)    	{    		book[it->to]=1;    		dfs(it->to);		}		it++;	}*/	st t;	//下标法 	for(int i=0;i<s[x].size();i++)	{   		t=s[x][i];		if(book[t.to]==0)		{       		dfs(t.to);		}	}    return;}void bfs(int x){   	cout<<x<<" ";	int q[N];//队列	int r=0,f=0;	q[r++]=x;//入队	book[x]=1;//标记	while(f!=r)	{   		int t=q[f++];//出队		for(int i=0;i<s[t].size();i++)		{   			if(book[s[t][i].to]==0)			{   				cout<<s[t][i].to<<" ";				book[s[t][i].to]=1;				q[r++]=s[t][i].to;//入队			}		}	}        }void add(int from,int to,int w)//链接结点 {   	st t;	t.to=to;	t.w=w;	s[from].push_back(t);//入栈}/*5 1  2  2 1  3  1 2  4  5 2  5  4 */int main(){       int w;    cin>>n;    int x,y;    for(int i=1;i<=n;i++)    {           s[i].clear();    }    for(int i=1;i<=n-1;i++)    {           scanf("%d%d%d",&x,&y,&w);        add(x,y,w);        add(y,x,w);    }    cout<<"邻接表"<<endl;    for(int i=1;i<=n;i++)    {       	cout<<'['<<i<<']'<<" ";    	for(int j=0;j<s[i].size();j++)    	{       		cout<<s[i][j].to<<" ";		}		cout<<endl;	}    cout<<"深搜遍历序列"<<endl;    dfs(1);//从编号为1的结点开始遍历     cout<<endl;    memset(book,0,sizeof(book));//标记数组置空     cout<<"广搜遍历序列"<<endl;    bfs(1);//从编号为1的结点开始遍历    return 0;}

转载地址:http://trel.baihongyu.com/

你可能感兴趣的文章
JDBC——(6)PreparedStatement的使用——图解查询操作流程
查看>>
JDBC——(6)PreparedStatement的使用——针对不同表的查询操作
查看>>
MyBatis——小知识:MyBatis_映射配置文件_参数值获取
查看>>
Java后端技术体系-学习顺序总结
查看>>
超炫粒子漩涡
查看>>
HTML特效代码大全
查看>>
网页的基本页面实现 ---- 标签
查看>>
Java.数组算法(补充)
查看>>
java编程常见类型题 --- 面向对象编程、程序逻辑(金字塔)、多线程同步
查看>>
【MapReduce】基础案例 ---- 自定义OutputFormat <根据内容输出到指定文件目录中>
查看>>
【Android】 模拟器上运行程序报错
查看>>
计算机网络ip知识点
查看>>
react(3)——导入了正确的包,但是运行不出来,原因是因为导入包的顺序有问题
查看>>
react(10)——三大属性state,props,refs,总结其特点
查看>>
mybatis(11)——在mybatis中配置并使用log4j日志
查看>>
7-39 魔法优惠券
查看>>
南京晓庄学院-数据库系统概论期末复习习题册(1)数据库系统概述
查看>>
南京晓庄学院-数据库系统概论期末复习习题册(4)数据库安全性
查看>>
fufu学前端之H5+Javascript
查看>>
web学习(三)
查看>>