图论初步——存图方式

图的定义

图是由若干给定的点及连接两点的线所构成的图形

图的例子

存图方式

邻接矩阵

优点:简单好写,实现不易出错
缺点:空间复杂度高,达到了O(n2)O(n^2)O(n2)的复杂度,不适用于大部分题

建图代码实现
memset(edge,127,sizeof(edge));  //赋极大值
for(int i=1;i<=m;i++){ //m为边数  
    cin>>x>>y>>w;  //x到y有一条权值为w的边  
    edge[x][y]=edge[y][x]=w; //存边
}	
查找代码实现
for(int i=1;i<=n;i++){   
    for(int j=1;j<=n;j++){
	if(edge[i][j]<=INF)
	  cout<<i<<"->"<<j<<": "<<w<<endl  
    }
}	
邻接表

优点:空间小,代码简单,时间较优
缺点:不好理解

建图代码实现
void Add(int x,int y,int z){
    nxt[++tot]=first[x];
    first[x]=tot;
    to[tot]=y;
    w[tot]=z;
}
解释

tottottot为边的编号
以上图333号点为例
先连边(3,1,6)(3,1,6)(3,1,6)
所以nxt[1]=first[3]=0nxt[1]=first[3]=0nxt[1]=first[3]=0; //边111的下一条边为000,即不存在
first[3]=1first[3]=1first[3]=1; //以333为端点的第一条边为111
to[1]=1to[1]=1to[1]=1; //第111条边的另一个端点为111
w[1]=6w[1]=6w[1]=6; //第111条边的长度为666
再连边(3,2,3)(3,2,3)(3,2,3)
所以nxt[2]=first[3]=1nxt[2]=first[3]=1nxt[2]=first[3]=1; //边222的下一条边为边111
first[3]=2first[3]=2first[3]=2;
to[2]=2to[2]=2to[2]=2;
w[2]=3w[2]=3w[2]=3;
然后连(3,4,1)(3,4,1)(3,4,1)
nxt[3]=first[3]=2nxt[3]=first[3]=2nxt[3]=first[3]=2;//边333的下一条边为边222

查找代码实现
for(int e=first[u];e;e=nxt[e]){
    int v=to[e];
    cout<<u<<"->"<<v<<": "<<w[e]<<endl;
}
解释

查找点333
first[3]=4;to[4]=6;first[3]=4; to[4]=6;first[3]=4;to[4]=6;
nxt[4]=3;to[3]=4;nxt[4]=3; to[3]=4;nxt[4]=3;to[3]=4;
nxt[3]=2;to[2]=2;nxt[3]=2; to[2]=2;nxt[3]=2;to[2]=2;
nxt[2]=1;to[1]=1;nxt[2]=1; to[1]=1;nxt[2]=1;to[1]=1;
nxt[1]=0;nxt[1]=0;nxt[1]=0;
不满足eee为真,跳出循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值