杭电 1142 十字链表存储

杭电 1142 十字链表存储  本来是想用二维数组实现的,但是想了一下发现,如果数据是稀疏矩阵的话,用二维数组存就会造成很多的空间浪费,而且遍历的时候也很浪费时间。学数据结构的时候书上教我们使用十字链表来存储稀疏矩阵,于是就想着用十字链表来实现。然后我发现我忘了十字链表的代码实现了…默默地去翻书,捣置了好久,终于写好了,乐滋滋的去oj提交代码,结果时间超限……  哎~把代码贴上来,就当加深一下十字链表的记忆吧~~#in…

大家好,又见面了,我是你们的朋友全栈君。

  本来是想用二维数组实现的,但是想了一下发现,如果数据是稀疏矩阵的话,用二维数组存就会造成很多的空间浪费,而且遍历的时候也很浪费时间。学数据结构的时候书上教我们使用十字链表来存储稀疏矩阵,于是就想着用十字链表来实现。然后我发现我忘了十字链表的代码实现了…默默地去翻书,捣置了好久,终于写好了,乐滋滋的去oj提交代码,结果时间超限……

  哎~ 把代码贴上来,就当加深一下十字链表的记忆吧~~

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
using namespace std;
multiset<int> s;
typedef struct lei
{ 
   
	int row,col;
	struct lei *right;   //行指针
	struct lei *down;    //列指针
	union                //共用体结构
	{ 
   
		int value;       //数据域
		struct lei *link;//头结点指针域
	}tag;
}lei;
lei *h[1001];
void Init(lei *&mh,int n,int m)   //初始化
{ 
   
	lei *r;
    mh=(lei *)malloc(sizeof(lei));//十字链表的入口
	mh->row=n;                             
	mh->col=m;                               
	r=mh;
	for(int i=0;i<10;i++)         //建立一个列表,其每个结点即为行表的头结点,也为列表的头结点,通过i(right),j(down)来判断此时是用行,还是列)
	{ 
   
		h[i]=(lei *)malloc(sizeof(lei));
		h[i]->down=h[i]->right=h[i];   //成环
		r->tag.link=h[i];              //说明他是一个头结点
		r=h[i];
	}
	r->tag.link=mh;                    //成环
}
void Push(int x,int y,int t)//插入元素
{ 
   
	lei *p,*q;              //r为第一个头结点
    p=(lei *)malloc(sizeof(lei));
	p->row=x;
	p->col=y;
	p->tag.value=t;
	q=h[x-1];               //h[x-1]为第x行的头结点
	while(q->right!=h[x-1] && q->right->col<y)//行表插入
	{ 
   
		q=q->right;
	}
	p->right=q->right;
    q->right=p;
	q=h[y-1];              //h[j-1] 为第y列的头结点
	while(q->down!=h[y-1] && q->down->row<x)//列表插入
	{ 
   
		q=q->down;
	}
	p->down=q->down;
	q->down=p;
}
lei* zhao(int x,int y)//找关于对角线对称的元素
{ 
   
	lei *r;
	r=h[x-1]->right;
	while(r->col!=y) //找列
		r=r->right;
	return r;
}
void cha(int x,int sum)//链表入口,下条路横坐标,总路程
{ 
   
	lei *p,*q,*r;
	int k;
	r=h[x-1]; //找行头结点
	p=r;             //第 x 行的头指针
	r=r->right;      //第 x 行的第一个元素
	while(r!=p)
	{ 
   
		if(r->tag.value==0||r->col==1)
		{ 
   
			r=r->right;
			continue;
		}
		if(r->col==2)
		{ 
   
			s.insert(sum+r->tag.value);
			r=r->right;
			continue;
		}
		k=r->tag.value;
        q=zhao(r->col,r->row);
		q->tag.value=0;
		r->tag.value=0;       //标记,已经走过了
		cha(r->col,sum+k);    //递归
		r->tag.value=k;
		q->tag.value=k;       //取消标记
		r=r->right;
	}
}
void shi(lei *mh)         //释放空间
{ 
   
    lei *p,*q,*r;
    p=mh->tag.link;
    while (p!=mh)
    { 
   
        q=p->right;
        while (p!=q)
        { 
   
			r=q;
            q=q->right;
			free(r);
        }
        p=p->tag.link;
    }
}
int main()
{ 
   
    lei *mh;
	int n,m;
	start=clock();
	while(scanf("%d",&n),n!=0)
	{ 
   
		scanf("%d",&m);
        Init(mh,n,m);
    	int x,y,t;
    	for(int i=0;i<m;i++)
		{ 
   
    		scanf("%d %d %d",&x,&y,&t);
	    	Push(x,y,t);
			if(y!=2)
	         	Push(y,x,t);
		}
		cha(1,0);
		printf("%d\n",s.count(*s.begin()));
	}
	shi(mh);
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150328.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java专业是什么专业,写的太详细了「建议收藏」

    java专业是什么专业,写的太详细了「建议收藏」前言SQL语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题。在生产环境中,SQL执行慢是很严重的事件。那么如何定位慢SQL、慢的原因及如何防患于未然。接下来带着这些问题让我们开启本期之旅!第1章:Dubbo的简史、后续的规划和整体架构大图————Dubbo高性能RPC通信框架1.1应用架构演进过程1.2Dubbo简介1.3Dubbo总体大图第2章:Dubbo的环境配置和基于Dubbo开发第一款应用程序————开发第一款Dubbo应用程序

  • 2015/8/26 Python基础(1):基本规则及赋值「建议收藏」

    2015/8/26 Python基础(1):基本规则及赋值「建议收藏」Python有如下的基本规则:#后表示注释\n是行分隔符\是继续上一行,将过长语句分开;分号将两个语句连接在一行中:冒号将代码头和体分开代码块用缩进块的方式体现不同缩进深度分隔不同的代码

  • 路由器5g启用视频网络_聚合路由器是什么

    路由器5g启用视频网络_聚合路由器是什么5G版聚合路由器加速释放超高清视频传输应用随着物联网5G商用步伐的加速和5G网络建设的突飞猛进,2022年无疑成为5G向千行百业拓展落地的关键之年。作为“新基建”的领头羊,5G已凝聚产业链力量,蓄势待发为行业的智能化和数字化转型赋能,为新一轮经济增长提速。作为5G技术在超高清视频传输领域应用的领先代表,推出了最新一代5G高速物联网QYT-X1S聚合路由器,可支持构建点对点安全传输链路,支持移动/联通/电信混用,实现多达7条2G/3G/4G/5G/卫星、有线聚合,成为5G应用落地的重点项目之一。5G要

  • 【html】【一个简单的用户登录页面代码】

    【html】【一个简单的用户登录页面代码】结果代码&lt;!DOCTYPEhtml&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;用户登录.html&lt;/title&gt; &lt;metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"&gt;&lt;met

  • Python怎么取整(Python程序打包)

    Python取整方式:背景在处理数据的时候,碰到了一个问题,就是取整方式!比如给定一个数值型列表,我需要分别获取它位置为长度的0%,25%,50%,75%,100%处的几个数字。但Python自带的int是向下取整,如果数字长度是5,理论上这五个数字分别对应0%,25%,50%,75%,100%的位置,但使用int,结果却并不是入次。比如当5*0.75时,如果加上int(5*0.7

  • ClassLoader cl = getClass().getClassLoader()[通俗易懂]

    ClassLoader cl = getClass().getClassLoader()[通俗易懂]ClassLoadercl=getClass().getClassLoader()getClass():取得当前对象所属的Class对象  getClassLoader():取得该Class对象的类装载器

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号