1. 程式人生 > >Code 非遞迴..輸出歐拉回路邊路徑..

Code 非遞迴..輸出歐拉回路邊路徑..

                題意:

                         給一個進位制k(1~5)..輸出一種方案使得0~10^k-1排成一排(相鄰的每k位都為不同的數,所以長度嚴格為10^k+k-1),,,並且字典序最小..

                題解:

                        想了好久..寫了好久..看了別人的程式碼..才完全明白...解釋幾個地方:

                        1、點: 點是0~10^(k-1)的數...為什麼不能直接用第一位和最後一位..比如做那種首位相連的字串歐拉回路時.一個字串不時只要頭字元和末字元兩個資訊就可以了嗎...因為兩個數字相接不是最後一個和第一個相同就行了...必須是前面數的後k-1位和後一個數的前k-1位相同..

.一定要注意...所以對於此類問題做點可以總結為.用會相互重疊的部分做為點....

                        2、邊: 邊就是代表了0~10^k的數

                        3、歐拉回路: 因為這麼構造任意點的入度=出度..所以存在歐拉回路

                        4、RE..因為遞迴過多..所以要手動模擬遞迴....

                        5、由於我的鄰接表習慣用插頭法構造...所以做邊時從9~0新增就可以保證在找路徑時順著找就能找到最小字典序解...

Program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<time.h>
#include<map>
#include<algorithm>
#define ll long long
#define eps 1e-5
#define oo 1000000007
#define pi acos(-1.0)
#define MAXN 1000500
#define MAXM 1000500
using namespace std;
struct node
{
       int y,id,next;
}line[MAXM],temp[MAXM]; 
int Lnum,_next[MAXN],ans[MAXM],num,S[MAXN],Snum; 
bool used[MAXM];
void addline(int x,int y,int id)
{
       line[++Lnum].next=_next[x],_next[x]=Lnum,line[Lnum].y=y,line[Lnum].id=id;
}
void dfs(int x)
{
       int i,k; 
       Snum=0,S[++Snum]=x;
       while (Snum)
       {
             x=S[Snum--]; 
             for (k=_next[x];k;k=line[k].next) 
                if (!used[line[k].id])
                {
                     used[line[k].id]=true; 
                     S[++Snum]=x,S[++Snum]=line[k].y;
                     goto A;
                }
             ans[++num]=x; 
             A: ;
       }
}
int main()
{             
       int n,k,i,x,y;  
       while (~scanf("%d",&k) && k)
       {
               if (k==1) 
               {
                       printf("0123456789\n");
                       continue;
               }
               n=1;
               for (i=1;i<k;i++) n*=10; 
               Lnum=0,memset(_next,0,sizeof(_next));
               for (i=0;i<n;i++)  
               {
                       x=i%(n/10);
                       for (y=9;y>=0;y--) addline(i,x*10+y,i*10+y);
               }
               memset(used,false,sizeof(used)),num=0;
               dfs(0);
               for (i=1;i<k-1;i++) ans[++num]=0;
               for (i=num;i>=1;i--) printf("%d",ans[i]%10);
               printf("\n");
       }
       return 0;
}


相關推薦

Code ..輸出路邊路徑..

                題意:                          給一個進位制k(1~5)..輸出一種方案使得0~10^k-1排成一排(相鄰的每k位都為不同的數,所以長度嚴格為10^k+k-1),,,並且字典序最小..                

UOJ 117 路(套圈法+路徑輸出+騷操作)

height int ima 標記 圖片 style 技術分享 () targe 題目鏈接:http://uoj.ac/problem/117 題目大意: 解題思路:先判斷度數:      若G為有向圖,歐拉回路的點的出度等於入度。      若G為無向圖,歐拉

【轉】鄰接矩陣輸出所有簡單路徑

原文連結:深搜(非遞迴)實現獲取兩點之間的路徑 #include <stdio.h> #include <tchar.h> #include <stdlib.h> #include <iostream> #include <stack>

演算法學習之實現二叉樹結點及其層數的輸出

背景 這半年在準備考研,所以沒有對技術棧進行更新或複習,部落格也沒有更新……但上週學院宣佈畢業設計(企業實習)開題了,要找老師找單位,這才不得不犧牲晚上下軍棋的時間,複習或學習程式設計的知識……   今天記錄一下解決這個問題: 非遞迴實現二叉樹的遍歷,以及輸出每一個結點和其

路--輸出路的路徑

//有向or無向均可,重邊 step1:從u開始,找到與他相連的v,放入棧,刪除(u,v)這條邊,然後從v開始 step2:當有一點沒有與他相連的點時,放入path,然後從stack取棧頂繼續

codeforces 723e One-Way Reform (路) || 路徑輸出模板

There are n cities and m two-way roads in Berland, each road connects two cities. It is known that there is no more than one road con

初學路/路徑的判定 & 尤圖的有關問題

歐拉回路 簡介: 歐拉回路:每條邊恰好只走一次,並能回到出發點的路徑. 尤拉路徑:經過每一條邊一次,但是不要求回到出發點. 尤拉圖:圖當且僅存在歐拉回路. 半尤拉圖:圖當且僅存在尤拉路徑. 常規操作: 關於尤拉圖的問題,一般是判迴路的存在性或生

hdu 4850 字串構造---路構造序列 +實現

http://acm.hdu.edu.cn/showproblem.php?pid=4850 題意:構造長度為n的字元序列,使得>=4的子串只出現一次 其實最長只能構造出來26^4+4-1= 456979 的序列,大於該數的都是不可能的。構造方法,就是那種歐拉回路的序

poj 1780 Code【尤通路+DFS】

CodeTime Limit: 1000MSMemory Limit: 65536KTotal Submissions: 2723Accepted: 951DescriptionKEY Inc., the leading company in security hardwar

POJ 1041 John's trip(路+輸出路徑)

題意:         給你一個無向圖,資料格式如點x 點y 邊Z,表示由x點和y點構成了Z邊。現在要問你該圖中是否存在歐拉回路,如果存在,則輸出字典序最小的那條歐拉回路(輸入按序走過的所有邊標號)。且題目中保證了該無向圖是連通的。 別的博文有一些方法

二叉樹遍歷,層次遍歷,反轉,輸出路徑等常見操作詳細總結

1.序言 在實際工作中,很多業務場景其實也需要一些比較巧妙的演算法來支撐,並不是業務邏輯就全是複製貼上或者說重複的程式碼寫一百遍。越是隨著演算法研究的深入,越是發現數據結構的重要性。或者說,資料結構中就蘊藏著無數精妙演算法的思想,很多演算法的思想在資料結構中體現得非常突出。而作為一種

建立有向圖的鄰接表,深度優先遍歷和廣度優先遍歷的演算法,判斷是否是有向無環圖,並輸出一種拓撲序列

/*(1)輸入一組頂點,建立有向圖的鄰接表,進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。 寫出深度優先遍歷的遞迴和非遞迴演算法。 (2)根據建立的有向圖,判斷該圖是否是有向無環圖,若是,則輸出其一種拓撲有序序列。*/ #include<stdio.h>

7-9 採用後序遍歷演算法輸出從根節點到每個葉子節點的路徑逆序列

//採用後序遍歷非遞迴演算法輸出從根節點到每個葉子節點的路徑逆序列 #include "btree.cpp" typedef struct { BTNode *data[MaxSize]; //存放棧中的資料元素 int top; //存放棧頂指標,即棧頂

擴充套件幾里德演算法 實現及證明

關於歐幾里得演算法,貝祖等式,擴充套件歐幾里得演算法,Wikipedia的解釋非常非常詳細了。 另外,看了好多別人優秀的總結,我認為最詳盡的就是ACM之家的總結。 這裡自己再總結一次…實際上就是把別人總結的,我認為有助於自己理解的內容copy過來,再加上

圖詳解 ()(重新更改)

定義: 歐拉回路:每條邊只經過一次,而且回到起點 尤拉圖:具有歐拉回路的圖 尤拉路徑:每條邊只經過一次,不要求回到起點 半尤拉圖:具有尤拉通路而無歐拉回路的圖 判定: 歐拉回路的判定 無向圖:連通(不考慮度為 0 的點),每個頂點度數都為偶數。 有向圖:基圖連通(

poj 1780 Code(路+鼓輪模型)

Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1645 Accepted: 625 Description KEY Inc., the leading company in s

以二叉連結串列的方式建立一棵二叉樹,並以演算法中序輸出;計算二叉樹的繁茂度,並判斷二叉樹是否為完全二叉樹

以二叉連結串列的方式存二叉樹,輸入時要以先序方式輸入,其中,空子樹用#表示。 二叉樹的繁茂度定義為其高度乘其每層結點最大值。演算法為先用遞迴演算法求二叉樹高度:其高度為左右子樹最大值加1,所以用先序遍歷,定義ld與rd分別為左右子樹高度,最後返回其較大值加1即可。二叉樹寬度

斐波契數列的寫法(c/java)

C語言版本:#include <stdio.h> long fib(long n) { if(n<=2) return(1); if(n>=3) return(fi

根據二叉樹前序中序輸出後續遍歷 +前中後三種遍歷的解法+廣度優先遍歷

          根據二叉樹前序中序輸出後續遍歷           +前中後三種遍歷的遞迴與非遞迴解法           +廣度優先遍歷 #include<iostream> #include<cstring> #include<st

put ++ .cn -1 bool ret 技術分享 代碼 can 思路 根據歐拉圖的概念來。 註意 點數為1; 有孤立點; 代碼實現 T掉的dfs... 1 #include<cstdio> 2 const int max