1. 程式人生 > >【圖論】最小環演算法

【圖論】最小環演算法

做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