版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程名稱 《數(shù)據(jù)結(jié)構(gòu)》 </p><p> 課題名稱 最小生成樹問題 </p><p> 專業(yè) 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 班級 10計(jì)本2班
2、 </p><p> “最小生成樹問題”課程設(shè)計(jì)</p><p> 題目: 編制一個求出N個頂點(diǎn)圖的最小生成樹程序</p><p><b> 一 需求分析:</b></p><p> (1)在n個城市間建設(shè)通信網(wǎng)絡(luò),只需要架設(shè)n-1條線路即可。以最低的代價建設(shè)這個通信網(wǎng),即求圖的最小生成樹。 </p>
3、;<p> (2)利用克魯斯卡爾算法求網(wǎng)的最小生成樹。</p><p> (3)利用自定義的隊(duì)列結(jié)構(gòu)存放連通分量。</p><p> (4)以文本形式輸出最小生成樹中的各條邊及它們的權(quán)值。輸出格式為(int a,int b,int n),其中a,b為頂點(diǎn)序號,n為ab邊的權(quán);</p><p> (5)程序運(yùn)行流程:</p><
4、;p> 1)提示輸入頂點(diǎn)數(shù)目;</p><p> 2)接受輸入,按照項(xiàng)目要求產(chǎn)生邊權(quán)值的隨機(jī)矩陣;然后求解最小生成樹;</p><p> 3)輸出最小生成樹并且退出;</p><p><b> (6)測試數(shù)據(jù):9</b></p><p><b> 二 概要設(shè)計(jì):</b></p&
5、gt;<p> 1.表示邊的類定義和接口:</p><p> class MyArc</p><p><b> {</b></p><p><b> public:</b></p><p> int m_beginVex;</p><p> int
6、m_endVex;</p><p> int m_weight;</p><p> MyArc(int beginVex,int endVex,int weight);</p><p><b> MyArc(){}</b></p><p><b> //重載運(yùn)算符</b></p>
7、<p> inline bool operator < (const MyArc& arc){ return m_weight<arc.m_weight;}</p><p> inline bool operator == (const MyArc& arc){ return m_weight==arc.m_weight;}</p>&l
8、t;p> inline bool operator > (const MyArc& arc){ return m_weight>arc.m_weight; }</p><p><b> };</b></p><p> 2. 用鄰接矩陣表示的圖類的定義和接口:</p><p> class Graph&l
9、t;/p><p><b> {</b></p><p><b> private:</b></p><p> int m_vexnum;</p><p> int m_arcnum;</p><p> int *m_pmatrix;</p><p&g
10、t;<b> public:</b></p><p><b> ~Graph();</b></p><p> Graph(int vexnum);</p><p> Graph(int vexnum,int *pmatrix);</p><p> void insert(MyArc arc
11、);//連通arc 邊</p><p> bool bound(int x); //判斷頂點(diǎn)x是否已與其它頂點(diǎn)連通</p><p><b> };</b></p><p> 3. 自定義隊(duì)列,用于存放連通圖,或按權(quán)排列后的邊:</p><p> class MyQueues</p><p&
12、gt;<b> {</b></p><p><b> public:</b></p><p> list<MyArc> m_list;</p><p> MyQueues(){}</p><p> void insert(const MyArc& arc); //按權(quán)值
13、大小排序插入</p><p> void InsertGraph(const Graph &graph); //將圖的連通分量插入隊(duì)列</p><p> MyArc pop();//出隊(duì)列</p><p><b> };</b></p><p><b> 4.本程序的結(jié)構(gòu)</b>&l
14、t;/p><p><b> 1)主程序模塊:</b></p><p> void main()</p><p><b> {</b></p><p> 申明邊權(quán)值矩陣數(shù)組并用隨機(jī)函數(shù)初始化;</p><p><b> 創(chuàng)建圖;</b></p&
15、gt;<p> 調(diào)用克魯斯卡爾算法函數(shù);</p><p> 輸出邊的權(quán)值矩陣,最小生成樹中的各條邊及它們的權(quán)值</p><p><b> 退出;</b></p><p><b> }</b></p><p> 2)帶權(quán)的邊類模塊---實(shí)現(xiàn)帶權(quán)邊的存儲和運(yùn)算。</p>
16、;<p> 鄰接矩陣類模塊---實(shí)現(xiàn)圖的狀態(tài)記錄和相關(guān)操作。</p><p> 自定義隊(duì)列類模塊---實(shí)現(xiàn)邊的按權(quán)存貯和相關(guān)操作。</p><p> 3)核心kruskal算法模塊---用克魯斯卡爾算法求出最小生成樹 </p><p><b> 各模塊調(diào)用關(guān)系:</b></p><p><b&
17、gt; 三 詳細(xì)設(shè)計(jì)</b></p><p> #include<iostream></p><p> #include<stdlib.h>//產(chǎn)生隨機(jī)數(shù)組用</p><p> #include<time.h> //同上</p><p> //#include "basic.
18、h" //所用到的自定義數(shù)據(jù)結(jié)構(gòu)定義和實(shí)現(xiàn)文件</p><p> using namespace std;</p><p> #include<list></p><p> /*MyStack 堆棧類的結(jié)構(gòu) [ 0 1 ... curlen ... size] [棧底(bottom) ... prt ... ]*/
19、</p><p> #define BASESIZE 64 //默認(rèn)堆棧數(shù)組空間大?。?*8),可以自擴(kuò)充</p><p> template <class Type> </p><p> class MyStack</p><p><b> {</b></p><p>
20、;<b> private:</b></p><p> Type *bottom; // 元素存放的動態(tài)數(shù)組 </p><p> int size,ptr; // 堆棧大小和當(dāng)前棧頂元素索引</p><p><b> public: </b></p><p><b&
21、gt; //構(gòu)造函數(shù)</b></p><p> MyStack() </p><p><b> {</b></p><p> bottom=new Type[BASESIZE];ptr=-1;size=BASESIZE;</p><p><b> };</b><
22、;/p><p><b> //析構(gòu)函數(shù)</b></p><p> ~MyStack(){delete []bottom;};</p><p><b> //清棧還原</b></p><p> inline void clear()</p><p><b> {
23、</b></p><p> if(bottom!=NULL)</p><p> delete []bottom;</p><p> bottom=new Type[size];</p><p> ptr=-1; </p><p><b> };</b><
24、/p><p><b> //判???lt;/b></p><p> inline bool IsEmpty()</p><p><b> {</b></p><p> if(ptr==-1) return true;</p><p> else return false;&l
25、t;/p><p><b> }</b></p><p><b> //入棧</b></p><p> int push(Type e);</p><p><b> //出棧</b></p><p> int pop(Type &e);<
26、;/p><p><b> //獲得棧頂元素</b></p><p> int top(Type &e);</p><p> int settop(Type e);</p><p> // 用callback函數(shù)對棧從低向上遍歷</p><p> void traverse(void
27、callback(Type *),Type *); </p><p><b> private:</b></p><p> inline int extent()</p><p><b> {</b></p><p> int s=size;</p><p> Ty
28、pe *temp=new Type[size];</p><p> for(int i=0;i<s;i++)</p><p> temp[i]=bottom[i];</p><p><b> size*=2;</b></p><p><b> clear();</b></p>
29、;<p><b> ptr=s+1;</b></p><p> for(int i=0;i<s;i++)</p><p> bottom[i]=temp[i];</p><p> delete [] temp;</p><p> return size;</p><p&g
30、t;<b> }</b></p><p><b> };</b></p><p> /*MyStack的實(shí)現(xiàn) */</p><p><b> /*壓棧*/</b></p><p> template <class Type> </p><
31、;p> int MyStack<Type>::push(Type e) // </p><p> { </p><p> if(++ptr==size) extent();</p><p> bottom[ptr]=e; </p><p> return ptr; </p>&
32、lt;p><b> }</b></p><p><b> /*出棧*/</b></p><p> template <class Type> </p><p> int MyStack<Type>::pop(Type &e) // </p><p>&l
33、t;b> {</b></p><p> if(ptr==-1)</p><p> return -2;//???,返回 -2 !</p><p><b> else </b></p><p> e=bottom[ptr--]; </p><p> ret
34、urn ptr;</p><p><b> }</b></p><p> /*獲取棧頂元素*/</p><p> template <class Type></p><p> int MyStack<Type>::top(Type &e) // </p><p&
35、gt;<b> {</b></p><p> if(ptr==-1)</p><p> return -1;//???返回 -1 !</p><p><b> else</b></p><p> e=bottom[ptr];</p><p> return ptr
36、;</p><p><b> }</b></p><p> /*設(shè)置棧定元素*/</p><p> template <class Type></p><p> int MyStack<Type>::settop(Type e) //</p><p><b&g
37、t; {</b></p><p> if(ptr==-1)</p><p> return -1;//棧空,返回 -1 !</p><p><b> else</b></p><p> bottom[ptr]=e;</p><p> return ptr;</p>
38、;<p><b> }</b></p><p> /*用callback函數(shù)對棧從低向上遍歷*/</p><p> template <class Type></p><p> void MyStack<Type>::traverse(void callback(Type *),Type *e)&l
39、t;/p><p><b> {</b></p><p> if(callback!=NULL)</p><p><b> {</b></p><p> for(int i=0;i<=ptr;i++)</p><p><b> {</b><
40、;/p><p> e=&bottom[i];</p><p> callback(e);</p><p><b> }</b></p><p><b> }</b></p><p><b> }; // </b></p>&l
41、t;p> /*MyPoint 坐標(biāo)結(jié)構(gòu) */</p><p> typedef struct MyPoint</p><p><b> {</b></p><p><b> int x, y;</b></p><p> } *pMyPoint;</p><p&g
42、t;<b> //</b></p><p><b> /*表示邊的類*/</b></p><p> class MyArc</p><p><b> {</b></p><p><b> public:</b></p><p&
43、gt; int m_beginVex;</p><p> int m_endVex;</p><p> int m_weight;</p><p> MyArc(int beginVex,int endVex,int weight);</p><p><b> MyArc(){}</b></p>
44、<p> bool operator < (const MyArc& arc)</p><p><b> {</b></p><p> return m_weight<arc.m_weight;</p><p><b> }</b></p><p> bool
45、 operator == (const MyArc& arc)</p><p><b> {</b></p><p> return m_weight==arc.m_weight;</p><p><b> }</b></p><p> bool operator > (con
46、st MyArc& arc)</p><p><b> {</b></p><p> return m_weight>arc.m_weight;</p><p><b> }</b></p><p><b> };</b></p><p
47、> MyArc::MyArc(int beginVex,int endVex,int weight):m_beginVex(beginVex),m_endVex(endVex),m_weight(weight)</p><p><b> {}</b></p><p> /*用鄰接矩陣表示的圖類,可以帶權(quán),權(quán)不可以為0*/</p><p&
48、gt; class Graph</p><p><b> {</b></p><p><b> public:</b></p><p> int m_vexnum;</p><p> int m_arcnum;</p><p> int *m_pmatrix;&l
49、t;/p><p><b> public:</b></p><p><b> ~Graph();</b></p><p> Graph(int vexnum);</p><p> Graph(int vexnum,int *pmatrix);</p><p> void
50、 insert(MyArc arc);//按權(quán)值大小排序插入</p><p> bool bound(int x); //判斷頂點(diǎn)x是否已與其它頂點(diǎn)連通</p><p><b> };</b></p><p><b> //構(gòu)造函數(shù)</b></p><p> Graph::Graph(i
51、nt vexnum)</p><p><b> {</b></p><p> m_pmatrix=new int[vexnum*vexnum];</p><p> m_vexnum=vexnum;m_arcnum=0;</p><p> for(int i=0;i<vexnum*vexnum;++i) m_
52、pmatrix[i]=0;</p><p><b> }</b></p><p><b> //構(gòu)造函數(shù)</b></p><p> Graph::Graph(int vexnum,int *pmatrix)</p><p><b> {</b></p>&
53、lt;p> m_vexnum=vexnum;</p><p> // m_arcnum=arcnum;</p><p> m_pmatrix=new int[m_vexnum*m_vexnum];</p><p> for(int i=0;i<m_vexnum*m_vexnum;++i)</p><p> m_pmatr
54、ix[i]=pmatrix[i];</p><p><b> }</b></p><p> //測試 頂點(diǎn)x是否已與其他點(diǎn)連通</p><p> bool Graph::bound(int x)</p><p><b> {</b></p><p> for(int
55、 i=0;i<m_vexnum;++i) if(m_pmatrix[x+i*m_vexnum]!=0) return true;</p><p> return false;</p><p><b> }</b></p><p> //在鄰接表中連通 arc表示的邊,并且設(shè)置權(quán)</p><p> void
56、Graph::insert(MyArc arc)</p><p><b> {</b></p><p> m_pmatrix[arc.m_beginVex*m_vexnum+arc.m_endVex]=arc.m_weight;</p><p> m_pmatrix[arc.m_endVex*m_vexnum+arc.m_beginVex
57、]=arc.m_weight;</p><p> ++m_arcnum;</p><p><b> }</b></p><p> Graph::~Graph()</p><p><b> {</b></p><p> delete[] m_pmatrix;</
58、p><p><b> }</b></p><p> /*自定義隊(duì)列,用于存放連通圖,或按權(quán)排列后的邊*/</p><p> class MyQueues</p><p><b> {</b></p><p><b> public:</b><
59、/p><p> list<MyArc> m_list;</p><p> MyQueues(){}</p><p> void insert(const MyArc& arc);//邊按權(quán)值插入隊(duì)列中合適位置,</p><p> void InsertGraph(const Graph &graph);//將圖
60、的連通分量插入隊(duì)列</p><p> MyArc pop();</p><p><b> };</b></p><p><b> //邊出隊(duì)</b></p><p> MyArc MyQueues::pop()</p><p><b> {</b&g
61、t;</p><p> MyArc arc=m_list.front();</p><p> m_list.pop_front(); </p><p> return arc;</p><p><b> }</b></p><
62、p> //邊按權(quán)值插入隊(duì)列中合適位置,</p><p> void MyQueues::insert(const MyArc& arc)</p><p><b> {</b></p><p> list<MyArc>::iterator pos=m_list.begin();</p><p&
63、gt; while(pos!=m_list.end())</p><p><b> {</b></p><p> if(*pos>arc) break;</p><p> else ++pos;</p><p><b> }</b></p><p> m_l
64、ist.insert(pos,arc);</p><p><b> }</b></p><p> //將圖的連通分量插入隊(duì)列</p><p> void MyQueues::InsertGraph(const Graph &graph)</p><p><b> {</b></
65、p><p> for(int i=0;i<graph.m_vexnum;++i)</p><p><b> {</b></p><p> for(int j=i+1;j<graph.m_vexnum;++j)</p><p> if(graph.m_pmatrix[i*graph.m_vexnum+j])
66、 insert(MyArc(i,j,graph.m_pmatrix[i*graph.m_vexnum+j]));</p><p><b> }</b></p><p><b> }</b></p><p> bool IsCycle(Graph &graph,MyArc& arc); //
67、判斷是否構(gòu)成回路</p><p> void kruskal(const Graph& graph,Graph& smtree);//克魯斯卡爾算法</p><p> void SmallestTreeOutput(const Graph& smtree); //輸出最小生成樹 </p><p> void SetMatrix(int
68、vexnum,int *matrix); //用隨機(jī)數(shù)組初始化matrix數(shù)組并且打印</p><p><b> /*主函數(shù)*/</b></p><p> void main()</p><p><b> {</b></p><p><b> char i;</b&g
69、t;</p><p> cout<<"************************************************"<<endl;</p><p> cout<<”標(biāo)題:最小生成樹”<<endl;</p><p> cout<<"班級:計(jì)本2班&quo
70、t;<<endl;</p><p> cout<<"姓名:張娟"<<endl;</p><p> cout<<"學(xué)號:10012121 "<<endl;</p><p> cout<<"***************************
71、*********************"<<endl;</p><p> cout<<"請輸入頂點(diǎn)數(shù)目:";</p><p><b> cin>>i;</b></p><p> int vex=i-'0';</p><p> i
72、nt *matrix=new int[vex*vex];</p><p> cout<<endl;</p><p> SetMatrix(vex,matrix); </p><p> Graph graph(vex,matrix),smtree(vex);</p><p> kruskal(graph,smtree
73、);</p><p> SmallestTreeOutput(smtree);</p><p> delete []matrix;</p><p><b> }</b></p><p> //用隨機(jī)數(shù)組初始化matrix數(shù)組并且打印</p><p> void SetMatrix(int
74、 vexnum,int *pmatrix)</p><p><b> { </b></p><p> srand((unsigned)time(NULL));</p><p> for(int i=0;i<vexnum;++i)//產(chǎn)生隨機(jī)權(quán)值矩陣</p><p><b> {</b
75、></p><p> for(int j=i;j<vexnum;++j)</p><p><b> { </b></p><p><b> if(j==i)</b></p><p><b> {</b></p><p> p
76、matrix[i*vexnum+j]=0;</p><p><b> continue;</b></p><p><b> }</b></p><p> int rnum=rand();rnum%=99;rnum++;//產(chǎn)生1~99的隨機(jī)整數(shù)作為邊的權(quán)值</p><p> pmatrix[
77、i*vexnum+j]=rnum;</p><p> pmatrix[j*vexnum+i]=rnum;</p><p><b> }</b></p><p><b> }</b></p><p> cout<<"***隨機(jī)產(chǎn)生的各邊權(quán)值矩陣 [頂點(diǎn)數(shù)為 "&
78、lt;<vexnum<<"] ****\n";</p><p> for( i=0;i<vexnum;++i)//輸出隨機(jī)權(quán)值矩陣</p><p><b> {</b></p><p> for(int j=0;j<vexnum;++j)</p><p><b
79、> { </b></p><p> cout<<pmatrix[i*vexnum+j]<<"\t";</p><p><b> }</b></p><p> cout<<endl;</p><p><b> }</
80、b></p><p><b> }</b></p><p> //判斷連通邊arc后 圖graph 是否存在回路 </p><p> bool IsCycle(Graph& graph, MyArc& arc) </p><p><b> {</b></p&g
81、t;<p> list<int> mylist;</p><p> mylist.push_back(arc.m_beginVex);</p><p> int *ps=new int[graph.m_vexnum];</p><p> for(int i=0;i<graph.m_vexnum;++i)</p>
82、<p><b> ps[i]=0;</b></p><p> while(!mylist.empty())</p><p><b> {</b></p><p> int x=mylist.front();</p><p><b> ps[x]=1;</b>
83、</p><p> mylist.pop_front();</p><p> for(int i=0;i<graph.m_vexnum;++i)</p><p><b> {</b></p><p> if(graph.m_pmatrix[i+x*graph.m_vexnum]!=0)</p>
84、<p><b> {</b></p><p> if(i==arc.m_endVex) return true;</p><p> if(ps[i]!=1) mylist.push_back(i);</p><p><b> }</b></p><p><b> }&
85、lt;/b></p><p><b> }</b></p><p> delete[] ps; </p><p> return false;</p><p><b> }</b></p><p><b> //克魯斯卡爾算法</b>&l
86、t;/p><p> void kruskal(const Graph& graph,Graph& smtree)</p><p><b> {</b></p><p> MyQueues arcqueues;//保存從小到大排列的邊</p><p> arcqueues.InsertGraph(gra
87、ph);</p><p> MyArc myarc;//Arc表示邊的類型</p><p> int arcnum=0; //邊的個數(shù)</p><p> while(arcnum<graph.m_vexnum-1)</p><p><b> {</b></p><p> myarc
88、=arcqueues.pop();</p><p> if(!IsCycle(smtree,myarc))</p><p><b> {</b></p><p> smtree.insert(myarc);</p><p><b> ++arcnum;</b></p><
89、p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> //輸出最小生成樹</b></p><p> void SmallestTreeOutput(const Gra
90、ph& smtree)</p><p><b> {</b></p><p> cout<<"最小生成樹:"<<endl;</p><p> for(int i=0;i<smtree.m_vexnum;++i)//輸出最小樹</p><p> for(in
91、t j=i+1;j<smtree.m_vexnum;++j)</p><p> if(smtree.m_pmatrix[i*smtree.m_vexnum+j]) cout<<'('<<i<<','<<j<<','<<smtree.m_pmatrix[i
92、*smtree.m_vexnum+j]<<')'<<endl;</p><p><b> }</b></p><p><b> 四 設(shè)計(jì)和調(diào)試分析</b></p><p> 1.在調(diào)試MyQueues類的時候,由于對數(shù)組的按行存儲理解的不夠好導(dǎo)致開始時未能獲得正確的數(shù)據(jù),經(jīng)單步
93、跟蹤調(diào)試后發(fā)現(xiàn)下標(biāo)超出范圍,修正后即可正常運(yùn)行。</p><p> 2.在本實(shí)驗(yàn)中,自定義了3個類,定義了基于它們的數(shù)據(jù)和操作,它們是本程序的實(shí)現(xiàn)基礎(chǔ)。</p><p> 3.由于翻譯核心算法 kruskal的時間復(fù)雜度與邊的數(shù)目的函數(shù)有線性關(guān)系,同時IsCycle函數(shù)含有while和for循環(huán),在頂點(diǎn)數(shù)目不多的時候,算法時間很快,適用于稀疏矩陣。 </p><p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計(jì)--最小生成樹問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---最小生成樹問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)java--最小生成樹
- 最小生成樹課程設(shè)計(jì)
- 最小生成樹課程設(shè)計(jì)
- 最小生成樹課程設(shè)計(jì)
- 最小生成樹課程設(shè)計(jì) (2)
- 最小生成樹求解課程設(shè)計(jì)報(bào)告
- 普里姆算法生成最小生成樹課程設(shè)計(jì)
- 徐州工程學(xué)院數(shù)據(jù)結(jié)構(gòu)最小生成樹實(shí)驗(yàn)文檔
- 數(shù)據(jù)結(jié)構(gòu),最小生成樹克魯斯卡爾算法的實(shí)現(xiàn)
- 課程設(shè)計(jì)---克魯斯卡爾算法求最小生成樹
- 4最小生成樹
- 4最小生成樹
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-- 圖的遍歷和生成樹求解
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-----最小套圈設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---圖的遍歷和生成樹求解
評論
0/150
提交評論