⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_refine.c

📁 graphcut源代码
💻 C
字号:
#include	<math.h>#include	"csa_types.h"#include	"csa_defs.h"extern	char	*st_pop();extern	rhs_ptr	deq_list();extern	void	st_reset();extern	stack	reached_nodes;extern	rhs_ptr	*bucket;extern	long	num_buckets;extern	rhs_ptr	head_rhs_node, tail_rhs_node;extern	unsigned	p_refines, r_scans;extern	unsigned	myclock(), p_refine_time;int	dfs_visit(w)register	rhs_ptr	w;{register	lr_aptr	a, a_stop;lhs_ptr	v;register	rhs_ptr	x;register	long	p;w->node_info.srchng = TRUE;if (w->node_info.priced_in && (v = w->matched))  {  a_stop = (v+1)->priced_out;  p = w->p;  for (a = v->first; a != a_stop; a++)    if (p + a->c - (x = a->head)->p < 0)      {      if (x->node_info.srchng)	return(0);      if (!x->node_info.srched && !dfs_visit(x))	return(0);      }  }w->node_info.srchng = FALSE; w->node_info.srched = TRUE;st_push(reached_nodes, w);return(1);}int	top_sort(){register	rhs_ptr	w, w_stop;st_reset(reached_nodes);for (w = head_rhs_node; w != tail_rhs_node; w++)  w->node_info.srched = w->node_info.srchng = FALSE;w_stop = head_rhs_node - 1;for (w--; w != w_stop; w--)  if (!w->node_info.srched && !dfs_visit(w))    return(0);return(1);}void	r_scan(w)register	rhs_ptr	w;{register	lr_aptr	a, a_stop;lhs_ptr	v;register	rhs_ptr	x;register	long	wk, xk;register	long	p;long	w_to_x_cost;r_scans++;if (w->node_info.priced_in && (v = w->matched))  {  a_stop = (v+1)->priced_out;  p = w->p;  wk = w->key;  for (a = v->first; a != a_stop; a++)    if (a != v->matched)      {      if ((w_to_x_cost = p + a->c - (x = a->head)->p) < 0)	xk = wk;      else	xk = wk - 1 - w_to_x_cost;      if (xk > x->key)	{	delete_list(x, &bucket[x->key]);	x->key = xk;	insert_list(x, &bucket[xk]);	}      }  }w->p -= w->key;w->key = num_buckets;}int	p_refine(){register	rhs_ptr	w, x;lhs_ptr	v;lr_aptr	a, a_stop;long	xk, max_key = 0;int	eps_opt = FALSE;register	long	delta_c, p;p_refine_time -= myclock();p_refines++;for (w = head_rhs_node; w != tail_rhs_node; w++)  {  /*  Adjust l-r arc costs to incorporate costs of r-l arcs, so that we  can deal with the l-r arcs only.  */  if (w->node_info.priced_in && (v = w->matched))    {    a_stop = (v+1)->priced_out;    delta_c = v->matched->c;#ifdef	STRONG_PO    /*    If we might price arcs back in, we need to adjust costs of    priced-out arcs as well as those of priced-in arcs.    */    a = v->priced_out;#else    a = v->first;#endif    for (; a != a_stop; a++)      a->c -= delta_c;    }  }while (top_sort() && !eps_opt)  {  for (w = head_rhs_node; w != tail_rhs_node; w++)    w->key = 0;  max_key = 0;  while (!st_empty(reached_nodes))    {    w = (rhs_ptr) st_pop(reached_nodes);    if (w->key > max_key) max_key = w->key;    if ((v = w->matched) && w->node_info.priced_in)      {      a_stop = (v+1)->priced_out;      p = w->key - w->p;      for (a = v->first; a != a_stop; a++)	{	x = a->head;	xk = p - 1 - a->c + x->p;	if (xk > x->key) x->key = xk;	}      }    }  if (max_key == 0)    eps_opt = TRUE;  else    {    for (w = head_rhs_node; w != tail_rhs_node; w++)      insert_list(w, &bucket[w->key]);    for (; max_key > 0; max_key--)      while (bucket[max_key] != tail_rhs_node)	r_scan(deq_list(&bucket[max_key]));    bucket[0] = tail_rhs_node;    }  }p_refine_time += myclock();return(eps_opt);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -