深度遍歷算法php
遍歷源節點所在的邊 記錄第一個和源節點有鄰接關係的點記爲s if(s沒被訪問)訪問遞歸訪問s所在的鏈 不然返回
遍歷順序
廣度遍歷算法node
遍歷源節點的全部邊而且入隊 while(隊不空) {s=隊頭 出隊 if(s沒被訪問){ 將與s有鄰接關係且同時沒有被反問過的進行入隊 } }
遍歷順序
Prim和Kruscal算法
兩者都是對貪心算法的改進而生成的算法ios
針對如下數據生成的最小生成樹順序 0 1 1 1 3 2 0 2 3 1 2 4 2 3 1 prim算法<0,1><1,3><2,3> Kruscal算法<0,1><2,3><1,2>
Dijkstra算法git
初始化數組path[]=-1,dist[無窮大],s[]=0; 將源的s[]置1 更新dist和path u=源點; while(i<g.n){ 找到與源點有鄰接關係的dist中的最小值 u=i; while(j<g.n){ if(dist[u]>dist[j]+g[u][j])更新dist數組 }
拓撲排序算法算法
初始化每一個元素的入度爲0 遍歷每一條鏈來統計每一個數的入度 入度爲0入隊 while(隊不空){ 遍歷隊頭所在的鏈,減小對應的點的入度 入度爲0入隊}
定義每一層次的隊尾爲last,層次爲u=0 遍歷源節點的全部邊而且入隊 last=源節點 u++; while(隊不空&&u<=6) {s=隊頭 出隊 if(s沒被訪問){ 將與s有鄰接關係且同時沒有被反問過的進行入隊 } if(s==last)last=隊尾,u++ }
本身打還好考試的時候沒注意數據量用了矩陣作最後一個點過不去數組
prim算法 /*初始化訪問數組vis表明是否加入到最小生成樹, 初始化權重數組d爲無窮*/ 將源點的vis置爲1,更新與原點有鄰接關係的節點的權重數組 for(int i=1;i<=n;i++) { u=-1; min=inf; 找尋d數組中的最小值 並記錄最小值對應的下標。 if(u==-1)說明該圖不可以連同return-1 else vis[u]=true; 路徑疊加 for(int v=1;v<=n;v++) if(G[u][v]<d[v]) 更新dis數組 }
前面瞎寫了一下後面參考書本更改了函數
初始化數組path[]=-1,dist[無窮大],s[]=0; 初始化記錄路徑總數的ans爲0 將源的s[]置1 更新dist和pathans u=源點; while(i<g.n){ 找到與源點有鄰接關係的dist中的最小值 u=i; while(j<g.n){ if(dist[u]>dist[j]+g[u][j].weight)更新dist數組,ans數組 else if(dist[u]==dist[j]+g[u][j].weight){ 更新dist數組ans數組 } } if(
這個路徑的數目沒有就解決一開始後面用疊加一下就能夠解決學習
圖的代碼太長找了個比較感興趣的代碼
http://acm.hdu.edu.cn/showproblem.php?pid=1147
題意是在一個平面上按順序擺上放一些棍子,求最後哪些棍子在最上面(此題只需考慮規範相交的狀況)這樣咱們只要判斷這些棍子是否相交相交就是往上面
疊起來的意思spa
/** *判斷後面的線段是否與前面的線段相交, *此題仍是一個判斷線段是否相交的問題, *只是必須注意順序,判斷相交的函數減hdu1086 */ #include<iostream> #include<cstring> #include<cmath> using namespace std; typedef struct Node{ double x,y; }node; node p[100005],p1[100005]; double Direction(node pi,node pj,node pk){//計算叉乘 return (pk.x-pi.x)*(pj.y-pi.y)-(pj.x-pi.x)*(pk.y-pi.y); } bool Segments_X(node p1,node p2,node p3,node p4){//判斷兩條線段是否相交,相交返回true double d1,d2,d3,d4; d1=Direction(p3,p4,p1); d2=Direction(p3,p4,p2); d3=Direction(p1,p2,p3); d4=Direction(p1,p2,p4); if(d1*d2<=0&&d3*d4<=0) return true; return false; } int main() { int n; while(cin>>n&&n){ for(int i=1;i<=n;i++){ cin>>p[i].x>>p[i].y;//輸入第一個點 cin>>p1[i].x>>p1[i].y;//輸入第二個點 } cout<<"Top sticks: "; for(int i=1;i<n;i++){ int ok=1; for(int j=i+1;j<=n;j++){//之判斷在該線段以後拋下的線段(木棍) if(Segments_X(p[i],p1[i],p[j],p1[j])){ ok=0; break; } } if(ok) cout<<i<<", "; } cout<<n<<"."<<endl;//輸出最後一個 } return 0; }
這道題目難的不是解題可能更難的是看懂題目
就是利用數學去判斷線段是否相交設計