杭电 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)


相关推荐

  • 使用docker启动mysql8.0挂载配置文件_docker的特点

    使用docker启动mysql8.0挂载配置文件_docker的特点使用docker启动MySQL8.0因为mysql8对登录密码的加密方式做了调整,所以每次安装完mysql都要去翻翻教程,特此记录下,方便以后查看docker启动脚本#!/bin/bashdockerrm-fmysql8dockerrun–namemysql8\-eMYSQL_ROOT_PASSWORD=123456\-v/usr/local/mysql/logs:/logs\-v/usr/local/mysql/data:/var/lib/mys

  • 数仓分层理论_多元分层理论

    数仓分层理论_多元分层理论​数仓分层、元数据管理、数据质量管理

  • java和python区别_Python和Java之间的区别:主要功能

    java和python区别_Python和Java之间的区别:主要功能java和python区别Python或Java,哪个更好?这个问题在全球开发者社区引发了许多激烈的讨论。初学者开发人员可能对应该掌握两者中的哪一个有所怀疑。初创公司和公司可能想知道哪种方案在他们的下一个项目中会更好。这两种语言都可以以相同的效率解决许多任务,这不足为奇。但是,在某些情况下,一个人可以击败另一个人。在本文中,我们将基于多个方面来分析它们的优缺点。对于那…

  • 转 提问的智慧

    转 提问的智慧维基入口: 提问的智慧英文版http://www.catb.org/~esr/faqs/smart-questions.html中文版http://www.beiww.com/doc/oss/smart-questions.html

  • Alex 的 Hadoop 菜鸟教程: 第16课 Pig 安装使用教程

    Alex 的 Hadoop 菜鸟教程: 第16课 Pig 安装使用教程本教程介绍Pig的安装和使用。hdfs虽说是一个文件空间,但是我们每次要查看hdfs上的文件的时候都要输入一大串命令,比如一个简单的ls都需要输入:hdfsdfs-ls/,而且还不能cd到某个目录,这样就造成了每次ls都要带上全路径的麻烦,能不能有一个工具可以模拟linux下的shell呢?Pig就实现了这样的需求,可以直接ls,可以cd到某个目录。并且Pig还创造了PigLatin语言,可以通过Pig写一个类似存储过程的MapReduce的Job,pig会自动帮你把这个job翻译成MapR

  • python-pcl可视化点云工具(windows和ubuntu18.04安装及测试)

    python-pcl可视化点云工具(windows和ubuntu18.04安装及测试)

发表回复

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

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