杭电 1142 十字链表存储
生活随笔
收集整理的這篇文章主要介紹了
杭电 1142 十字链表存储
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本來是想用二維數(shù)組實現(xiàn)的,但是想了一下發(fā)現(xiàn),如果數(shù)據(jù)是稀疏矩陣的話,用二維數(shù)組存就會造成很多的空間浪費,而且遍歷的時候也很浪費時間。學數(shù)據(jù)結構的時候書上教我們使用十字鏈表來存儲稀疏矩陣,于是就想著用十字鏈表來實現(xiàn)。然后我發(fā)現(xiàn)我忘了十字鏈表的代碼實現(xiàn)了…默默地去翻書,搗置了好久,終于寫好了,樂滋滋的去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; //數(shù)據(jù)域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]; //成環(huán)r->tag.link=h[i]; //說明他是一個頭結點r=h[i];}r->tag.link=mh; //成環(huán) } 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; }總結
以上是生活随笔為你收集整理的杭电 1142 十字链表存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二级菜单HTML原理,CSS多级菜单的实
- 下一篇: [转]Eclipse Java注释模板设