杭电 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 黑盒测试用例设计之nextdate问题[通俗易懂]

    黑盒测试用例设计之nextdate问题[通俗易懂]首先已知有三个变量:月份,日期和年变量月份,日期和年都为整数,且都满足条件:1<=月份<=121<=日期<=311912<=年<=2012等价类划分法1.首先输入数据,划分等价类2.建立等价类表3.设计测试用例原型4.考虑隐含需求分为平年和闰年进行讨论,主要针对二月份。边界值分析法首先明晰三个定义:内点:范围内部的点上点:边界…

    2022年6月8日
    28
  • RegisterStartupScript 过期

    RegisterStartupScript 过期1.ClientScriptManager.RegisterStartupScript方法:  1)  ClientScriptManager.RegisterStartupScript (Type,String,String)  2)  ClientScriptManager.RegisterStartupScript (Type,String,String,

    2022年7月20日
    13
  • mysql中多表嵌套查询例子_mysql子查询嵌套规则

    mysql中多表嵌套查询例子_mysql子查询嵌套规则本文实例分析了MySQL嵌套查询。分享给大家供大家参考,具体如下:MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQLUserManual):1.SELECT语句的子查询语法:代码如下:SELECT…FROM(subquery)ASname…先创建一个表:CREATETABLEt1(s1INT,s2CHAR(…

    2022年10月21日
    1
  • Selenium WebDriver下载安装

    Selenium WebDriver下载安装SeleniumWebDriver下载1.确认操作系统版本->win10,64位系统2.确认要使用的浏览器及版本->谷歌浏览器,91.0.4472.77(正式版本)(64位)3.去找webdriver驱动a.谷歌浏览器驱动下载地址:http://chromedriver.storage.proxy.ustclug.org/index.html【找与本机谷歌浏览器版本相匹配的驱动版本,最后一位小版本77可不对应,Windows系统选择chromedriver_win32.zip下载即

    2022年9月19日
    1
  • linux文件重命名rename「建议收藏」

    linux文件重命名rename「建议收藏」linux下rename提供了有效的方法来处理重命名1.修改后缀名(eg.将当前目录下以.log为后缀的文件为以.txt为后缀)rename.log.txt*.logorrename’s/.log$/.txt/’*.log2.删除后缀名(eg.将当前目录下.txt文件的后缀)rename’s/.txt$//’*.txt3.添加后缀名(eg.给当前目录下的

    2022年9月10日
    0
  • mac视频录制工具推荐[通俗易懂]

    mac视频录制工具推荐[通俗易懂]AVAideScreenRecorderforMac是一款mac视频录制工具,可帮助用户可以选择录制整个屏幕或自定义区域,支持声音的同步录制,以1080p等高清质量以高达60fps的速度录制屏幕活动、视频和游戏。它可以让您以无损质量处理所有屏幕录制任务,包括Zoom会议、视频通话、文件、在线课程等。除了屏幕捕获之外,我们的屏幕录像机还可以作为一个令人难以置信的音频和声音和录音机,将您的录音提升到一个新的水平。任何希望为音乐制作、音频笔记或其他任何东西创建专业品质音频的人都可

    2022年6月17日
    35

发表回复

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

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