【圖論】最小環演算法
做vijos1046時想最小環想了半天,還是沒想出來,到網上一搜原來是用floyd來求……
最小環
環,,i,j,k三點,環長則為三點 兩兩間距,
且路不能有交點,
所以,我們想到map[i][j] + dist[i][k] + dist[j][k]
map記錄最短路,dist記錄直接相連的邊
只要map[i][j]不過k點就算得出一個環
讓最短路不過k點
想到floyd的dp方程
結果呼之欲出了吧~~我就不說了,直接上虛擬碼
/*由於是無向圖所以計算可以少一半。。*/ dist = map; k = 1->n; { i = 1->k-1; j = i+1->k; ans = min(ans,map[i][j] +dist[i][k] + dist[j][k] );//需注意的是i,j,k三點不能相同,所以迴圈終止是k-1,i-1。。。 i = 1->n; j = 1->i; dist[i][j] = min(dist[i][j],dist[i][k] + dist[k][j]); }
vijos1046程式碼,最小環實用
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; #define INF 10000000 #define MAX 101 int n,m,map[MAX][MAX]; int floyd() { int mincircle = INF; int Dist[n+1][n+1]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { Dist[i][j] = map[i][j]; } for(int k = 1; k <= n; k++) { for(int i = 1; i < k; i++) for(int j = i+1; j < k; j++) { mincircle = min(mincircle,Dist[i][j]+map[j][k]+map[k][i]); } for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { Dist[i][j] = min(Dist[i][j],Dist[i][k] + Dist[k][j]); } } return mincircle; } void init() { int b,e,l; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { map[i][j] = INF; } map[i][i] = 0; } for (int i = 1; i <= m; i++) { scanf("%d %d %d",&b,&e,&l); map[b][e] = map[e][b] = min(map[b][e],l); } int ans = floyd(); if ( ans >= INF ) { printf("No solution."); } else { printf("%d",ans); } } int main() { freopen("in.txt","r",stdin); while(scanf("%d %d",&n,&m) != EOF) { init(); printf("\n"); } return 0; }
相關推薦
【圖論】最小環演算法
做vijos1046時想最小環想了半天,還是沒想出來,到網上一搜原來是用floyd來求…… 最小環 環,,i,j,k三點,環長則為三點 兩兩間距, 且路不能有交點, 所以,我們想到map[i][j] + dist[i][k] + dist[j][k] map記錄最短路,
【圖論】最大流之EK演算法與Dinic演算法及最小費用最大流
最大流: 給出一張網路圖,並指定源點和終點,每條邊都有它的容量,起點有著無限的流量,求從源點到經過的所有路徑的最終到達匯點的最大流量和。對於同一個節點,流入的流量之和和流出的流量之和相同,即假如結點1有12流量流入結點2,結點2分別有8流量流入結點3,4流量流入結點4,這種
【圖論】最優貿易
價格 highlight style 不同 相同 -s 存在 n) size [NOIP2009]最優貿易 描述 C 國有 n 個大城市和 m 條道路,每條道路連接這 n 個城市中的某兩個城市。任意兩個城市之間最多只有一條道路直接相連。這 m 條道路中有一部分為單向
【圖論】最短路徑
最短路徑問題(floyed.cpp dijkstra.cpp) 題目描述 平面上有n個點(n<=100),每個點的座標均在-10000~10000之間。其中的一些點之間有連線。若有連線,則表示可從一個點到達另一個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之
【圖論】深入理解Dijsktra演算法
1. 介紹 Dijsktra演算法是大牛Dijsktra於1956年提出,用來解決有向圖單源最短路徑問題;但是不能解決負權的有向圖,若要解決負權圖則需要用到Bellman-Ford演算法。Dijsktra演算法思想:在DFS遍歷圖的過程中,每一次取出離源點的最近距離的點,將該點標記為已訪問,鬆弛與該點相鄰的結
【每日演算法】【圖論】【最小邊覆蓋 & 最小路徑覆蓋 & 最小頂點覆蓋 & 最大獨立集 & 最大團】
最小邊覆蓋 = 最大獨立集 = |V| - 最大匹配數 這個是在原圖是二分圖上進行的 最小路徑覆蓋和最小邊覆蓋不同,不要求給的圖是二分圖,而是要求是N x N的有向圖,不能有環,然後根據原圖構造二分圖,構造方法是將點一分為二,如,i分為i1和i2然後如果i和j有邊,那麼就在i
求圖中的最小環【洛谷P2661】
求有向圖中的最小環問題。 對於入度為0的點,肯定不在環內。我們就把入度為0的點刪掉。注意,刪掉入度為0的點,可能造成與之相鄰點的入度為0,我們就遞迴把聯通的結點全部刪掉。 然後對於每個環,我們遍歷所有剩下的環,儲存一個最小值就OK啦! 程式碼: #include
【圖割】最大流/最小割演算法詳解(Yuri Boykov and Vladimir Kolmogorov,2004 )
最大流/最小割(Max-Flow/Min-Cut)在解決計算機視覺中的能量方程最小化問題的強大,最早發現是Greig於1989年發表的文章:Exact Maximum A Posteriori Estimation for Binary Images。 最大流最小割演算法求解的能量方程,通常是基於圖結構
【codefroces 1037 E Trips】【圖論】【逆向思維】【好】【度大於等於k的最大子圖】
【連結】 【題意】 有n個人,一開始都不是朋友,m天每天都會有x,y成為朋友,現在他們有trip,只有他們出去玩的朋友數大於等於k才能出去,求每天出去最多的人數。朋友關係不具有傳遞性 【思路】 用set維護圖,並記錄與點相連的邊集。如果圖從無到有建邊,那麼每加入一
【模板】最小環
解析: 在一個無向圖裡找出一個由至少三個點組成環,使得環上邊的權值和最小。 程式碼: #include<cctype> #include<cstdio> #
【二分圖匹配】 最小點覆蓋==最大匹配數
先說一下,什麼叫做最小覆蓋點。 在一個二分圖中,一個x部或y部的覆蓋點可以覆蓋與之相連的所有線段,選擇一些點,使得覆蓋所有線段,點數最少。 König定理:最小覆蓋點數==最大匹配數 我有兩個證明。 **********************
【圖論】單源點最短路模板(有向圖)Dijkstra
#include <cstdio> #include <iostream> #include <cstring> #include <queue> #in
無向圖:查詢最小環集合(最短路徑回溯演算法)
在無向圖中查詢最小環,就像需要查詢一個蜂窩中所有孔洞,如果只查詢數目,可以利用尤拉公式,若查詢到所有環,需要更進一步的搜尋。 方法:尋找到所有頂點的最短路徑,對每一個頂點,取出環,迴圈刪除頂點,輸出所有最小環。 注意:拓
【圖論】有向無環圖的拓撲排序
1. 引言 有向無環圖(Directed Acyclic Graph, DAG)是有向圖的一種,字面意思的理解就是圖中沒有環。常常被用來表示事件之間的驅動依賴關係,管理任務之間的排程。拓撲排序是對DAG的頂點進行排序,使得對每一條有向邊(u, v),均有u(在排序記錄中)比v先出現。亦可理解為對某點v而言,只
演算法 圖中求最小環路徑 最小環個數 最大平均環 求簡單無向圖中環的個數
最小環問題:求個圖中環路徑代價最小的迴路。 如何求最小環?假如有 路徑1->3->2,如果此時已經知道2-1的最短路徑就好了。 回想下floyed的更新過程,就會發現更新第k次時,比k小的點之間都是最短距離的(要是點是聯通的話)。所以給出解法:第k次更新圖時
【圖論】網絡流總結
hdu 3338 -m ini post 平衡 題目 esp urn data- 【圖論】網絡流總結 最大流部分 網絡流題目的關鍵:看出是網絡流而且確定正確的模型 最大流算法:用來解決從源點s到匯點t,整個網絡最多能輸送多少流量的題目 模
【圖論】Self-Assembly(6-19)
inline const 分析 i++ 不能 hash unbound tac 正方形 [UVA1572]Self-Assembly 算法入門經典第6章6-19(P172) 題目大意:有一些正方形,每條邊上都有A-~Z- A+~Z+的編號,或者00,A+的邊可以拼A-,
【noip模擬】最小點覆蓋
mes 都是 ons mar 長度 最小 一句話 標記 com Time Limit: 1000ms Memory Limit: 128MB Description 最小點覆蓋是指在二分圖中,用最小的點集覆蓋所有的邊。當然,一個二分圖的最小點覆蓋可能有很多
【圖論】tarjan
AS code 更新 out 聯通 ace 起點 是什麽 環路 剛接觸tarjan,tarjan其實更多是用來找強聯通分量。我這裏呢,是看qsc的視頻學的。卿學姐講的其實很清楚啦。 我這裏只是做個整理。 low[]:表示能到達這個點的最小編號。[樹枝邊]。啊,其實
有向圖中的最小環問題
details tarjan csdn class article AI 最小環 問題 cnblogs tarjan https://blog.csdn.net/weixin_39872717/article/details/78472910 http://www.cnbl