亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? graph.cpp

?? Graph Cut algorithm implementation. Includes MATLAB compiled codes.
?? CPP
字號:
/* graph.cpp */
/*
    Copyright 2001 Vladimir Kolmogorov (vnk@cs.cornell.edu), Yuri Boykov (yuri@csd.uwo.ca).

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/


#include <stdio.h>
#include "graph.h"

Graph::Graph(void (*err_function)(const char *))
{
	error_function = err_function;
	node_block_first = NULL;
	arc_for_block_first = NULL;
	arc_rev_block_first = NULL;
	flow = 0;
}

Graph::~Graph()
{
	while (node_block_first)
	{
		node_block *next = node_block_first -> next;
		delete node_block_first;
		node_block_first = next;
	}

	while (arc_for_block_first)
	{
		arc_for_block *next = arc_for_block_first -> next;
		delete arc_for_block_first -> start;
		arc_for_block_first = next;
	}

	while (arc_rev_block_first)
	{
		arc_rev_block *next = arc_rev_block_first -> next;
		delete arc_rev_block_first -> start;
		arc_rev_block_first = next;
	}
}

Graph::node_id Graph::add_node()
{
	node *i;

	if (!node_block_first || node_block_first->current+1 > &node_block_first->nodes[NODE_BLOCK_SIZE-1])
	{
		node_block *next = node_block_first;
		node_block_first = (node_block *) new node_block;
		if (!node_block_first) { if (error_function) (*error_function)("Not enough memory!"); exit(1); }
		node_block_first -> current = & ( node_block_first -> nodes[0] );
		node_block_first -> next = next;
	}

	i = node_block_first -> current ++;
	i -> first_out = (arc_forward *) 0;
	i -> first_in = (arc_reverse *) 0;

	i -> tr_cap = 0;

	return (node_id) i;
}

void Graph::add_edge(node_id from, node_id to, captype cap, captype rev_cap)
{
	arc_forward *a_for;
	arc_reverse *a_rev;

	if (!arc_for_block_first || arc_for_block_first->current+1 > &arc_for_block_first->arcs_for[ARC_BLOCK_SIZE])
	{
		arc_for_block *next = arc_for_block_first;
		char *ptr = new char[sizeof(arc_for_block)+1];
		if (!ptr) { if (error_function) (*error_function)("Not enough memory!"); exit(1); }
		if ((POINTER_CAST)ptr & 1) arc_for_block_first = (arc_for_block *) (ptr + 1);
		else              arc_for_block_first = (arc_for_block *) ptr;
		arc_for_block_first -> start = ptr;
		arc_for_block_first -> current = & ( arc_for_block_first -> arcs_for[0] );
		arc_for_block_first -> next = next;
	}

	if (!arc_rev_block_first || arc_rev_block_first->current+1 > &arc_rev_block_first->arcs_rev[ARC_BLOCK_SIZE])
	{
		arc_rev_block *next = arc_rev_block_first;
		char *ptr = new char[sizeof(arc_rev_block)+1];
		if (!ptr) { if (error_function) (*error_function)("Not enough memory!"); exit(1); }
		if ((POINTER_CAST)ptr & 1) arc_rev_block_first = (arc_rev_block *) (ptr + 1);
		else              arc_rev_block_first = (arc_rev_block *) ptr;
		arc_rev_block_first -> start = ptr;
		arc_rev_block_first -> current = & ( arc_rev_block_first -> arcs_rev[0] );
		arc_rev_block_first -> next = next;
	}

	a_for = arc_for_block_first -> current ++;
	a_rev = arc_rev_block_first -> current ++;

	a_rev -> sister = (arc_forward *) from;
	a_for -> shift  = (POINTER_CAST) to;
	a_for -> r_cap = cap;
	a_for -> r_rev_cap = rev_cap;

	((node *)from) -> first_out =
		(arc_forward *) ((POINTER_CAST)(((node *)from) -> first_out) + 1);
	((node *)to) -> first_in =
		(arc_reverse *) ((POINTER_CAST)(((node *)to) -> first_in) + 1);
}

void Graph::set_tweights(node_id i, captype cap_source, captype cap_sink)
{
	flow += (cap_source < cap_sink) ? cap_source : cap_sink;
	((node*)i) -> tr_cap = cap_source - cap_sink;
}

void Graph::add_tweights(node_id i, captype cap_source, captype cap_sink)
{
	register captype delta = ((node*)i) -> tr_cap;
	if (delta > 0) cap_source += delta;
	else           cap_sink   -= delta;
	flow += (cap_source < cap_sink) ? cap_source : cap_sink;
	((node*)i) -> tr_cap = cap_source - cap_sink;
}

/*
	Converts arcs added by 'add_edge()' calls
	to a forward star graph representation.

	Linear time algorithm.
	No or little additional memory is allocated
	during this process
	(it may be necessary to allocate additional
	arc blocks, since arcs corresponding to the
	same node must be contiguous, i.e. be in one
	arc block.)
*/
void Graph::prepare_graph()
{
	node *i;
	arc_for_block *ab_for, *ab_for_first;
	arc_rev_block *ab_rev, *ab_rev_first, *ab_rev_scan;
	arc_forward *a_for;
	arc_reverse *a_rev, *a_rev_scan, a_rev_tmp;
	node_block *nb;
	bool for_flag = false, rev_flag = false;
	int k;

	if (!arc_rev_block_first)
	{
		node_id from = add_node(), to = add_node();
		add_edge(from, to, 1, 0);
	}

	/* FIRST STAGE */
	a_rev_tmp.sister = NULL;
	for (a_rev=arc_rev_block_first->current; a_rev<&arc_rev_block_first->arcs_rev[ARC_BLOCK_SIZE]; a_rev++)
	{
		a_rev -> sister = NULL;
	}

	ab_for = ab_for_first = arc_for_block_first;
	ab_rev = ab_rev_first = ab_rev_scan = arc_rev_block_first;
	a_for = &ab_for->arcs_for[0];
	a_rev = a_rev_scan = &ab_rev->arcs_rev[0];

	for (nb=node_block_first; nb; nb=nb->next)
	{
		for (i=&nb->nodes[0]; i<nb->current; i++)
		{
			/* outgoing arcs */
			k = (POINTER_CAST) i -> first_out;
			if (a_for + k > &ab_for->arcs_for[ARC_BLOCK_SIZE])
			{
				if (k > ARC_BLOCK_SIZE) { if (error_function) (*error_function)("# of arcs per node exceeds block size!"); exit(1); }
				if (for_flag) ab_for = NULL;
				else          { ab_for = ab_for -> next; ab_rev_scan = ab_rev_scan -> next; }
				if (ab_for == NULL)
				{
					arc_for_block *next = arc_for_block_first;
					char *ptr = new char[sizeof(arc_for_block)+1];
					if (!ptr) { if (error_function) (*error_function)("Not enough memory!"); exit(1); }
					if ((POINTER_CAST)ptr & 1) arc_for_block_first = (arc_for_block *) (ptr + 1);
					else              arc_for_block_first = (arc_for_block *) ptr;
					arc_for_block_first -> start = ptr;
					arc_for_block_first -> current = & ( arc_for_block_first -> arcs_for[0] );
					arc_for_block_first -> next = next;
					ab_for = arc_for_block_first;
					for_flag = true;
				}
				else a_rev_scan = &ab_rev_scan->arcs_rev[0];
				a_for = &ab_for->arcs_for[0];
			}
			if (ab_rev_scan)
			{
				a_rev_scan += k;
				i -> parent = (arc_forward *) a_rev_scan;
			}
			else i -> parent = (arc_forward *) &a_rev_tmp;
			a_for += k;
			i -> first_out = a_for;
			ab_for -> last_node = i;

			/* incoming arcs */
			k = (POINTER_CAST) i -> first_in;
			if (a_rev + k > &ab_rev->arcs_rev[ARC_BLOCK_SIZE])
			{
				if (k > ARC_BLOCK_SIZE) { if (error_function) (*error_function)("# of arcs per node exceeds block size!"); exit(1); }
				if (rev_flag) ab_rev = NULL;
				else          ab_rev = ab_rev -> next;
				if (ab_rev == NULL)
				{
					arc_rev_block *next = arc_rev_block_first;
					char *ptr = new char[sizeof(arc_rev_block)+1];
					if (!ptr) { if (error_function) (*error_function)("Not enough memory!"); exit(1); }
					if ((POINTER_CAST)ptr & 1) arc_rev_block_first = (arc_rev_block *) (ptr + 1);
					else              arc_rev_block_first = (arc_rev_block *) ptr;
					arc_rev_block_first -> start = ptr;
					arc_rev_block_first -> current = & ( arc_rev_block_first -> arcs_rev[0] );
					arc_rev_block_first -> next = next;
					ab_rev = arc_rev_block_first;
					rev_flag = true;
				}
				a_rev = &ab_rev->arcs_rev[0];
			}
			a_rev += k;
			i -> first_in = a_rev;
			ab_rev -> last_node = i;
		}
		/* i is the last node in block */
		i -> first_out = a_for;
		i -> first_in  = a_rev;
	}

	/* SECOND STAGE */
	for (ab_for=arc_for_block_first; ab_for; ab_for=ab_for->next)
	{
		ab_for -> current = ab_for -> last_node -> first_out;
	}

	for ( ab_for=ab_for_first, ab_rev=ab_rev_first;
		  ab_for;
		  ab_for=ab_for->next, ab_rev=ab_rev->next )
	for ( a_for=&ab_for->arcs_for[0], a_rev=&ab_rev->arcs_rev[0];
		  a_for<&ab_for->arcs_for[ARC_BLOCK_SIZE];
		  a_for++, a_rev++ )
	{
		arc_forward *af;
		arc_reverse *ar;
		node *from;
		POINTER_CAST shift = 0, shift_new;
		captype r_cap, r_rev_cap, r_cap_new, r_rev_cap_new;

		if (!(from=(node *)(a_rev->sister))) continue;
		af = a_for;
		ar = a_rev;

		do
		{
			ar -> sister = NULL;

			shift_new = ((char *)(af->shift)) - (char *)from;
			r_cap_new = af -> r_cap;
			r_rev_cap_new = af -> r_rev_cap;
			if (shift)
			{
				af -> shift = shift;
				af -> r_cap = r_cap;
				af -> r_rev_cap = r_rev_cap;
			}
			shift = shift_new;
			r_cap = r_cap_new;
			r_rev_cap = r_rev_cap_new;

			af = -- from -> first_out;
			if ((arc_reverse *)(from->parent) != &a_rev_tmp)
			{
				from -> parent = (arc_forward *)(((arc_reverse *)(from -> parent)) - 1);
				ar = (arc_reverse *)(from -> parent);
			}
		} while (from=(node *)(ar->sister));

		af -> shift = shift;
		af -> r_cap = r_cap;
		af -> r_rev_cap = r_rev_cap;
	}

	for (ab_for=arc_for_block_first; ab_for; ab_for=ab_for->next)
	{
		i = ab_for -> last_node;
		a_for = i -> first_out;
		ab_for -> current -> shift     = a_for -> shift;
		ab_for -> current -> r_cap     = a_for -> r_cap;
		ab_for -> current -> r_rev_cap = a_for -> r_rev_cap;
		a_for -> shift = (POINTER_CAST) (ab_for -> current + 1);
		i -> first_out = (arc_forward *) (((char *)a_for) - 1);
	}

	/* THIRD STAGE */
	for (ab_rev=arc_rev_block_first; ab_rev; ab_rev=ab_rev->next)
	{
		ab_rev -> current = ab_rev -> last_node -> first_in;
	}

	for (nb=node_block_first; nb; nb=nb->next)
	for (i=&nb->nodes[0]; i<nb->current; i++)
	{
		arc_forward *a_for_first, *a_for_last;

		a_for_first = i -> first_out;
		if (IS_ODD(a_for_first))
		{
			a_for_first = (arc_forward *) (((char *)a_for_first) + 1);
			a_for_last = (arc_forward *) ((a_for_first ++) -> shift);
		}
		else a_for_last = (i + 1) -> first_out;

		for (a_for=a_for_first; a_for<a_for_last; a_for++)
		{
			node *to = NEIGHBOR_NODE(i, a_for -> shift);
			a_rev = -- to -> first_in;
			a_rev -> sister = a_for;
		}
	}

	for (ab_rev=arc_rev_block_first; ab_rev; ab_rev=ab_rev->next)
	{
		i = ab_rev -> last_node;
		a_rev = i -> first_in;
		ab_rev -> current -> sister = a_rev -> sister;
		a_rev -> sister = (arc_forward *) (ab_rev -> current + 1);
		i -> first_in = (arc_reverse *) (((char *)a_rev) - 1);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
樱桃视频在线观看一区| 菠萝蜜视频在线观看一区| 五月天欧美精品| 欧美在线免费观看亚洲| 久久精品网站免费观看| 亚洲电影第三页| 91在线看国产| 久久精品水蜜桃av综合天堂| 午夜一区二区三区视频| 成人久久视频在线观看| 欧美不卡视频一区| 石原莉奈一区二区三区在线观看| 色伊人久久综合中文字幕| 久久亚洲精华国产精华液| 日日夜夜精品视频天天综合网| 99久久国产综合精品女不卡| 久久久亚洲精品一区二区三区 | 亚洲午夜一区二区三区| 成人一区二区视频| 欧美精品一区二区三区久久久 | 久久国产人妖系列| 欧美日韩www| 亚洲国产精品欧美一二99| 99精品视频一区二区三区| 国产精品欧美精品| 成人亚洲一区二区一| 国产女同互慰高潮91漫画| 国产精品一线二线三线| 国产亚洲精品7777| 国产成人精品免费看| 久久久精品黄色| 国产精品一二三四五| 久久蜜桃香蕉精品一区二区三区| 久久99精品久久久久久久久久久久| 欧美一三区三区四区免费在线看 | 中文字幕在线一区| 不卡一区中文字幕| 亚洲欧美日韩中文播放| 91麻豆成人久久精品二区三区| 中文字幕一区免费在线观看| va亚洲va日韩不卡在线观看| 国产精品久久久久久久久快鸭| 成人福利视频在线看| 亚洲日穴在线视频| 欧美日韩亚洲综合一区| 日韩av一级片| 久久久www成人免费无遮挡大片| 国产电影一区二区三区| 国产精品国产三级国产普通话三级| 豆国产96在线|亚洲| 亚洲精品国产一区二区三区四区在线 | 高清av一区二区| 中文字幕综合网| 538prom精品视频线放| 韩国成人福利片在线播放| 中文字幕中文字幕在线一区 | 粉嫩在线一区二区三区视频| 亚洲欧美另类综合偷拍| 欧美福利一区二区| 国产一级精品在线| 夜夜操天天操亚洲| 欧美成人福利视频| 91看片淫黄大片一级在线观看| 亚洲高清在线精品| 国产午夜亚洲精品不卡| 在线视频你懂得一区| 免费看欧美美女黄的网站| 亚洲国产精华液网站w| 欧美日韩国产小视频在线观看| 韩国欧美一区二区| 亚洲成人自拍偷拍| 国产三级久久久| 日韩一区二区在线观看视频 | 7777精品伊人久久久大香线蕉 | 精品va天堂亚洲国产| 99久久精品99国产精品 | 亚洲欧美国产三级| 91精品午夜视频| 成人动漫中文字幕| 奇米影视7777精品一区二区| 国产精品美女久久久久高潮| 51精品久久久久久久蜜臀| 丁香网亚洲国际| 蜜臀av在线播放一区二区三区| 亚洲天天做日日做天天谢日日欢| 日韩一区二区电影网| 91免费视频网址| 国产精品88av| 日本视频在线一区| 亚洲一区二区精品3399| 中文字幕av一区二区三区免费看| 日韩片之四级片| 欧美日韩黄色一区二区| 色婷婷综合久色| 岛国一区二区在线观看| 国产真实乱偷精品视频免| 日韩中文字幕亚洲一区二区va在线| 亚洲欧洲一区二区在线播放| 久久久久久综合| 日韩欧美亚洲国产另类 | 午夜精品久久久久久久99樱桃| 国产精品视频你懂的| 欧美精品一区二区三区在线播放 | 精品久久久久久久一区二区蜜臀| 欧美亚洲动漫制服丝袜| 色偷偷久久一区二区三区| 99re成人在线| av亚洲精华国产精华精华| 高清不卡在线观看av| 韩日av一区二区| 国产一区 二区 三区一级| 精品一区二区三区香蕉蜜桃| 免费在线观看精品| 青青草原综合久久大伊人精品| 怡红院av一区二区三区| 1000精品久久久久久久久| 国产精品视频看| 国产精品女上位| ●精品国产综合乱码久久久久| 欧美激情中文不卡| 日韩一区有码在线| 亚洲色图制服诱惑 | 日韩电影在线一区| 日韩va亚洲va欧美va久久| 免费成人av在线播放| 久久精品国产99| 国产精品18久久久久久vr| 日韩av中文字幕一区二区三区| 秋霞电影一区二区| 国产一区不卡视频| 99久久精品情趣| 欧美日韩国产一区| 日韩美一区二区三区| 久久美女艺术照精彩视频福利播放| 久久久久97国产精华液好用吗| 国产精品女同一区二区三区| 亚洲欧美成人一区二区三区| 性做久久久久久免费观看| 麻豆精品在线视频| 成人免费看的视频| 欧美日韩另类国产亚洲欧美一级| 欧美日韩国产a| 国产欧美日韩久久| 一区二区成人在线| 国产一区二区中文字幕| 色欧美片视频在线观看| 日韩欧美黄色影院| 综合激情成人伊人| 免费观看日韩av| 91丝袜国产在线播放| 91精品国产高清一区二区三区蜜臀| 国产午夜精品久久| 亚洲影视在线观看| 国产黑丝在线一区二区三区| 日本韩国欧美三级| 欧美精品一区二区在线播放| 亚洲欧美日韩在线播放| 久久99在线观看| 欧美中文字幕亚洲一区二区va在线 | 国产成人免费xxxxxxxx| 欧美午夜影院一区| 国产女人aaa级久久久级 | 国产一区二区三区观看| 在线视频中文字幕一区二区| 久久亚洲私人国产精品va媚药| 玉米视频成人免费看| 国产精品亚洲视频| 欧美年轻男男videosbes| 国产精品色在线| 毛片av一区二区| 欧美日韩精品电影| 亚洲欧美日韩国产综合| 国产一区二区精品久久99| 欧美日韩在线播放三区四区| 日韩欧美国产精品一区| 亚洲福中文字幕伊人影院| 波多野结衣精品在线| 久久综合久久久久88| 天堂va蜜桃一区二区三区| 91久久奴性调教| 国产精品丝袜一区| 国产999精品久久| 精品国产一区二区三区av性色 | 国产一区二区女| 欧美一区二区人人喊爽| 亚洲一级电影视频| 99久久久久久| 综合色中文字幕| 成人国产亚洲欧美成人综合网| 亚洲精品一区二区三区影院| 麻豆成人91精品二区三区| 欧美精品一卡二卡| 五月婷婷激情综合网| 欧美三级电影网站| 午夜精彩视频在线观看不卡| 欧美无乱码久久久免费午夜一区| 亚洲精品久久嫩草网站秘色| 色噜噜狠狠色综合中国| 亚洲制服欧美中文字幕中文字幕| 在线观看免费亚洲|