杭电 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言分苹果_数据结构:使用C语言

    C语言分苹果_数据结构:使用C语言1、题目描述果园里有堆苹果,N(1<N<9)只熊来分。第一只熊把这堆苹果平均分为N份,多了一个,它把多的一个扔了,拿走了一份。第二只熊把剩下的苹果又平均分成N份,又多了一个,它同样把多的一个扔了,拿走了一份,第三、第四直到第N只熊都是这么做的,问果园里原来最少有多少个苹果?示例和说明如下:2、解题思路我的方法很简单就是从最小的可能的数开始,一个一个尝试,满足了测试的要求之后

    2022年10月10日
    3
  • C语言和JAVA的区别[通俗易懂]

    C语言和JAVA的区别[通俗易懂]java语言和c语言的区别:un公司推出的Java是面向对象程序设计语言,其适用于Internet应用的开发,称为网络时代重要的语言之一。Java可以用认为是C的衍生语言,与C在大量元以内成分保持相同,例如此法结构、表达式语句、运算符等与C基本一致:但Java更简洁,没有C中冗余以及容易引起异常的功能成分,并且增加了多线程、异常处理、网络编程等方面的支持功能。本文从多角度对Java与C进行对比分析,为C与Java语言的学习提高一些借鉴。1、调法结构C与Java的词法结构很相似,针对程

    2022年7月7日
    24
  • pycharm中plt.plot没有把图画出来_pycharm运行不出来图片

    pycharm中plt.plot没有把图画出来_pycharm运行不出来图片一、问题描述pycharm开发工具使用plt.show()不显示图像,代码运行也不报错,如下图:二、问题原因pycharm开发工具中窗口显示的问题三、解决方式1、依次点击【File】——>【Setting】——>【Tools】——>【PythonScientific】–【取消勾选】-——>【Apply】-——>【ok】,如下图:2、再次运行程序即可显示图形,如下图:…

    2022年8月27日
    6
  • 【备忘录】麦克斯韦速率分布

    【备忘录】麦克斯韦速率分布突然想做麦克斯韦速度分布的复习,找到了以前读《新概念物理学·热学》的笔记发现高中时我如何臆测不得其解的东西竟然被这一页提纲挈领的笔记就解释很清楚了如果让我给高中时的我带话帮助他迅速理解这

    2022年7月4日
    24
  • ddns dnspod_dns和ddns的区别

    ddns dnspod_dns和ddns的区别NBNS——–NetBIOS漏洞【询问主机名】NBNS是网络基本输入/输出系统(NetBIOS)名称服务器的缩写。它也是TCP/IP协议的一部分。它负责将计算机名转化为对应的IP。其中,NamequeryNB是请求包,NamequeryresponseNB是响应包。双方的端口号均为137。NBNS在WIndows用的较少,Windows普遍采用LLMNR协议。在一个局域网中的两台主机,主机A的ip是:10.30.59.77,Mac地址为:HonHaipr_81:74:8A。主

    2022年8月31日
    2
  • oracle数据库文本类型_oracle修改字段数据类型

    oracle数据库文本类型_oracle修改字段数据类型在Oracle关于时间属性的建表Example:createtablecourses(cidvarchar(20)notnullprimarykey,cnamevarchar(20)notnull,ctypeinteger,ctimedateDEFAULTSYSDATE,cscorefloatnotnull)insertintocoursesvalues(‘…

    2025年9月20日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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