<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[Program Your World]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[c4pt0r和他的程序生活]]></description>
<link>http://hi.baidu.com/c4pt0r</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[Welcome the world of ring0]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/2e102560659f434debf8f88f.html]]></link>
        <description><![CDATA[
		
		<p style="margin: 0in 0in 10pt" class="MsoNormal"><font size="3"><span style=" mso-ascii- mso-ascii-theme-font: minor-latin; mso-fareast- mso-fareast-theme-font: minor-fareast; mso-hansi- mso-hansi-theme-font: minor-latin">多少有为青年在</span><font face="Calibri">windows</font><span style=" mso-ascii- mso-ascii-theme-font: minor-latin; mso-fareast- mso-fareast-theme-font: minor-fareast; mso-hansi- mso-hansi-theme-font: minor-latin">驱动的大门前徘徊，却最终</span><font face="Calibri">give up</font><span style=" mso-ascii- mso-ascii-theme-font: minor-latin; mso-fareast- mso-fareast-theme-font: minor-fareast; mso-hansi- mso-hansi-theme-font: minor-latin">。繁琐的函数，结构，恶心的调试固然是一方面，另一方面网上的资料又少的可怜，</span><font face="Calibri">msdn</font><span style=" mso-ascii- mso-ascii-theme-font: minor-latin; mso-fareast- mso-fareast-theme-font: minor-fareast; mso-hansi- mso-hansi-theme-font: minor-latin">写得像天书一样，网上的教程质量又参差不齐，而且说起软驱动（泛指运行在内核的代码），一直以来都属于</span><font face="Calibri">hacker</font><span style=" mso-ascii- mso-ascii-theme-font: minor-latin; mso-fareast- mso-fareast-theme-font: minor-fareast; mso-hansi- mso-hansi-theme-font: minor-latin">的领域，其实不然。其实比起驱动这个词，我更偏向内核程序这个称呼，驱动并不一定和真实的物理设备联系在一起。想知道为什么杀毒软件在你浏览文件的时候，甚至没打开就能知道其中有病毒呢？为什么防火墙能实现过滤吗？想知道键盘敲下去到字母显示在屏幕的过程中发生了什么吗？接下来我想写一点东西</span><font face="Calibri">about WDM</font><span style=" mso-ascii- mso-ascii-theme-font: minor-latin; mso-fareast- mso-fareast-theme-font: minor-fareast; mso-hansi- mso-hansi-theme-font: minor-latin">程序设计和内核态编程的东西，</span><font face="Calibri">Welcome to the World of Ring0.</font></font></p> <a href="http://hi.baidu.com/c4pt0r/blog/item/2e102560659f434debf8f88f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/2e102560659f434debf8f88f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-20  11:33</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/2e102560659f434debf8f88f.html</guid>
</item>

<item>
        <title><![CDATA[四则运算计算器。。。。test python and php]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/ebcecc8b2c5aa3dafd1f10e6.html]]></link>
        <description><![CDATA[
		
		&lt;html&gt;&lt;body&gt;&lt;h1&gt;&lt;?php <br>
<br>
if(isset($_POST[&quot;evl&quot;]))<br>
{<br>
&nbsp;&nbsp;&nbsp;  echo $_POST[&quot;evl&quot;].&quot;=&quot;;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  $cmd = &quot;echo 'print eval(\&quot;&quot;.$_POST[&quot;evl&quot;].&quot;\&quot;)'| python&quot;;<br>
&nbsp;&nbsp;&nbsp;  system($cmd);<br>
}<br>
<br>
?&gt;<br>
&lt;form method=post action=&quot;&quot;&gt;<br>
&lt;input type=text name=evl&gt;&lt;/input&gt;<br>
&lt;/input&gt;<br>
&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt; <a href="http://hi.baidu.com/c4pt0r/blog/item/ebcecc8b2c5aa3dafd1f10e6.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/ebcecc8b2c5aa3dafd1f10e6.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-17  10:32</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/ebcecc8b2c5aa3dafd1f10e6.html</guid>
</item>

<item>
        <title><![CDATA[tcplugin]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/11093ecf96e36835f8dc6106.html]]></link>
        <description><![CDATA[
		
		大家做TC时也许发现，有些牛人在你刚敲好乱七八糟class名和函数名的时候就已经交题了，在惊叹他们的思考能力的同时，还被他们神一般的打字速度折 服~~~其实，用插件可以帮你省很多时间~生成文件，测试，提交都能方便很多，现在介绍一下插件的配置方法。。。。大牛不要笑。。。。。<br>
<br>
<br>
首先，打开arena.随便进一个practise<br>
在工具栏最右边，会发现一个tools,里面有个topcoder plugin,打开它，会弹出个网页。下载这几个：<font face="Arial"> <strong>TZTester ，<strong>CodeProcessor ，<strong>FileEdit<span style="color: rgb(0, 0, 0);"><span style="font-weight: bold;"><span><br>
<br style="font-weight: normal;">
</span></span></span>回到arena，打开在options里面的editor，点add,Name可以随便起，EntryPoint输入</strong></strong></strong></font><font face="Arial"><strong><strong><strong>codeprocessor.EntryPoint，classpath 填写你那些3个jar的路径，用分号隔开。G:\tcplugin\CodeProcessor.jar;G:\tcplugin \FileEdit.jar;G:\tcplugin\TZTester.jar<br>
象这样。<br>
<br>
</strong></strong></strong></font><font face="Arial"><strong><strong><strong>好了之后，把添加的插件选上&ldquo;default&rdquo;,然后选中它，按config。Enter EntryPoint那里填fileedit.EntryPoint，processor class填<font face="Arial">tangentz.TZTester，然后按一下Verify，如果都found到，那就一切正常。<br>
</font></strong></strong></strong></font><font face="Arial"><strong><strong><strong><font face="Arial">然后按configure，勾上&ldquo;<font face="Arial">Write the problem de<a>script</a>ion using HTML</font>&rdquo;，把File Extension那里改成html，这样题目描述就会被生成一个html文件，方便看题。<br>
<br>
<font face="Arial">在&ldquo;Enter directory read/write problems to:&rdquo;这里填上你放程序文件的绝对路径</font><br>
然后按一下code template，把language改成c＋＋。<br>
输入下面的代码。<br>
<br>
</font></strong></strong></strong></font>
<pre style="width: 100%;">$BEGINCUT$<br>$PROBLEMDESC$<br>$ENDCUT$<br>#line $NEXTLINENUMBER$ &quot;$FILENAME$&quot;<br>#include &lt;string&gt;<br>#include &lt;vector&gt;<br>#include &lt;algorithm&gt;<br>#include &lt;numeric&gt;<br><br>#include &lt;iostream&gt;<br>#include &lt;sstream&gt;<br>#include &lt;queue&gt;<br>#include &lt;set&gt;<br>#include &lt;map&gt;<br>#include &lt;list&gt;<br><br>#include &lt;cstdio&gt;<br>#include &lt;cstdlib&gt;<br>#include &lt;cctype&gt;<br>#include &lt;cassert&gt;<br><br>#include &lt;cmath&gt;<br>#include &lt;complex&gt;<br>using namespace std;<br>#define FOR(i,a,b) for(int i=(a);i&lt;(b);i++)<br>#define PB push_back<br>#define ALL i.begin(),i.end()<br>#define rALL i.rbegin(),i.rend()<br>#define REP(i,n) for(int i=0;i&lt;(int)(n);++i)<br>#define SIZE(t) ((int)((t).size()))<br>class $CLASSNAME$<br>{<br>        public:<br>        $RC$ $METHODNAME$($METHODPARMS$)<br>        {<br>                $CARETPOSITION$<br>        }<br>        $TESTCODE$<br>};<br><br>// BEGIN CUT HERE<br>int main()<br>{<br>        $CLASSNAME$ ___test;<br>        ___test.run_test(-1);<br>        return 0;<br>}<br>// END CUT HERE</pre>
<font face="Arial"><strong><strong><strong><font face="Arial"><font face="Arial">然后在options里面的setup user preference里的editors的default Language选成C++<br>
~~~保存，重启arena~~~然后找个题看看吧~~~很厉害吧~~~</font></font></strong></strong></strong></font> <a href="http://hi.baidu.com/c4pt0r/blog/item/11093ecf96e36835f8dc6106.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/11093ecf96e36835f8dc6106.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-09  15:59</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/11093ecf96e36835f8dc6106.html</guid>
</item>

<item>
        <title><![CDATA[ubuntu 8.04安装virtualbox出错的解决办法。]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/48db38c61ffd761c9d163d2b.html]]></link>
        <description><![CDATA[
		
		sudo apt-get install virtualbox-ose-source
<p>cd /usr/src</p>
<p>sudo tar xjvf virtualbox*.bz2</p>
<p>cd modules/virtualbox-ose</p>
<p>sudo ./build_in_tmp install </p>
<p> </p>
<p> </p>
<p>然后再重新安装virtualbox</p> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/48db38c61ffd761c9d163d2b.html#comment">查看评论</a>]]></description>
        <pubDate>2009-01-25  09:48</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/48db38c61ffd761c9d163d2b.html</guid>
</item>

<item>
        <title><![CDATA[在主进程中捕获子进程的异常。。。]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/b86d6b2d15785d33349bf7eb.html]]></link>
        <description><![CDATA[
		
		为了让更多的学校拥有自己的oj,为了使得acm事业在国内高校中更加普及，偶计划写一系列的关于和做oj有关的win32内核技术文章然后将偶的oj kernel开源。。希望大家支持。。。。。
<p> </p>
<p>&nbsp;&nbsp;&nbsp;  今天的话题是：如何在得到子进程的异常呢？？？？？众所周知，在WIN32中可以通过SEH来进行结构化异常处理。但是，如果启动的进程不是我们写的，当 然不能给他的代码强行加上_try&nbsp;&nbsp;  _catch...然后它崩掉的时候就会弹出一个华丽丽的非法操作对话框。。。然后就囧了。。。</p>
<p>    当然，这是因为M$的__try, __expect,__final只限于处理进程内部，同一个线程内，位于   __try   {}block内部产生的异常。而我们需要的是启动的新进程~！</p>
<p>&nbsp;&nbsp;&nbsp;  不知道你有没有注意过，使用vc的时候。。调试模式运行程序，它会在runtime error的时候提前弹出一个对话框提示出现访问异常~哦！我们不正是需要这个效果吗？nice，我们就仿照vc做一个调试器好了~~<span >显然VC也是通过调用Windows API函数完成调试器的任务，而且，这些函数显然可以实现我们的要求。</span> <span >我们</span> <span >需要作的事情就是自己利用这些API函数，写一个简单的调试器。</span></p>
<p> </p>
<p>&nbsp;&nbsp;&nbsp;  如何编写实现我们的程序？需要哪些调试函数？有两种方法。。。。</p>
<p><span >
<p>&nbsp;&nbsp;&nbsp;  对于一个已经启动的进程而言，利用DebugActiveProcess函数就可以捕获目标进程，将目标进程进入被调试状态。</p>
<p>&nbsp;&nbsp;&nbsp;  BOOL DebugActiveProcess(DWORD dwProcessId);</p>
<p>&nbsp;&nbsp;&nbsp;  参数dwProcessId是目标进程的进程ID。如何通过ToolHelp系列函数或Psapi库函数获得一个运行程序的进程ID在很多文章中介 绍过，这里就不再重复。对于服务器程序而言，由于没有权限无法捕获目标进程，可以通过提升监视程序的权限得到调试权限进行捕获目标进程（用户必须拥有调试 权限）。</p>
<p>&nbsp;&nbsp;  而另外一种就是我们做oj所需要的，CreateProcess函数，设置必要的参数就可以将目标程序进入被调试状态。 <span >
<p>BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine, <br>
LPSECURITY_ATTRIBUTES lpProcessAttributes,  LPSECURITY_ATTRIBUTES <br>
lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID <br>
lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, <br>
LPPROCESS_INFORMATION lpProcessInformation );</p>
<p><span >&nbsp;&nbsp;&nbsp;  该函数的具体说明请参考MSDN，在这 里我仅介绍我们感兴趣的参数。这里和一般的用法不同，作为被调试程序dwCreationFlags必须设置为DEBUG_PROCESS或 DEBUG_ONLY_THIS_PROCESS。这样启动的目标程序就会进入被调试状态。这里说明一下DEBUG_PROCESS和 DEBUG_ONLY_THIS_PROCESS。DEBUG_ONLY_THIS_PROCESS就是只调试目标进程，而DEBUG_PROCESS参 数则不仅调试目标进程，而且调试由目标进程启动的所有子进程。比如：在A.exe中启动B.exe，如果用 DEBUG_ONLY_THIS_PROCESS启动，监视进程只调试A.exe不会调试B.exe，如果是DEBUG_PROCESS就会调试 A.exe和B.exe。 当然，我们是做oj,不允许用户使用多进程，所以我们只讨论启动参数为DEBUG_ONLY_THIS_PROCESS的情况。</span></p>
<p> </p>
<p>一个小例子：</p>
<p>&nbsp;&nbsp;&nbsp;  STARTUPINFO si;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  PROCESS_INFORMATION pi;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  si.cb = sizeof(STARTUPINFO);&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GetStartupInfo(&amp;si);&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  si.wShowWindow = SW_HIDE;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  char *Dir  = &quot;d:\\1.exe&quot;;&nbsp;&nbsp;&nbsp;&nbsp;  //这个程序是一个除零的程序。<br>
&nbsp;&nbsp;&nbsp;  if(!CreateProcess(NULL,Dir,NULL,NULL,TRUE,DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&amp;si,&amp;pi))  <br>
&nbsp;&nbsp;&nbsp;  {&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cout&lt;&lt;&quot;Error on CreateProcess()&quot;;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  } </p>
<p> </p>
<p>&nbsp;&nbsp;&nbsp;  如果你直接运行上面的代码，毫无疑问还是会崩掉。。。。我们需要的是捕获异常~~~</p>
<p><span >&nbsp;&nbsp;&nbsp;  当目标进程进入了被调试状态，调试程序 （这里调试程序就是我们的主程序）就负责对被调试的程序进行调试操作的调度。调试程序通过WaitForDebugEvent函数获得来 自被调试程序的调试消息，调试程序根据得到的调试消息进行处理，被调试进程将暂停操作，直到调试程序通过ContinueDebugEvent函数通知被 调试程序继续运行。当然，我们不需要continue了，因为这时候直接给用户返回RE，然后kill掉它就好了。。。。</span></p>
</span></p>
</span></p>
<p>BOOL WaitForDebugEvent(<br>
  LPDEBUG_EVENT lpDebugEvent,  // debug event information<br>
  DWORD dwMilliseconds&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // time-out value<br>
);</p>
<p>在参数lpDebugEvent中可以获得调试消息，需要注意的是该函数必须和让目标程序进入调试状态的线程是同一线程。也就是说和CreateProcess调用的线程是一个线程。</p>
<p> </p>
<p>DEBUG_EVENT会保存子进程的调试信息。</p>
<p><span >typedef struct _DEBUG_EVENT { <br>
  DWORD dwDebugEventCode; <br>
  DWORD dwProcessId; <br>
  DWORD dwThreadId; <br>
  union { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  EXCEPTION_DEBUG_INFO Exception; <br>
&nbsp;&nbsp;&nbsp;  CREATE_THRECheck the input<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(&quot;\nREQUEST:\n&quot;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  message.writeTo(System.out);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  //Close the connection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  connection.close();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  } catch(Exception e) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  System.out.println(e.getMessage());<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br>
&nbsp;&nbsp;&nbsp;  }<br>
}</span></p>
<p>其中我们关心的是<span >union中的</span> <span >Exception,这里保存这异常调试信息~~~它的ExceptionCode常用的以下取值：</span></p>
<p>EXCEPTION_INT_DIVIDE_BY_ZERO</p>
<p>EXCEPTION_INT_OVERFLOW</p>
<p>EXCEPTION_ACCESS_VIOLATION</p>
<p>EXCEPTION_DATATYPE_MISALIGNMENT</p>
<p>EXCEPTION_FLT_STACK_CHECK</p>
<p>EXCEPTION_INVALID_DISPOSITION</p>
<p>EXCEPTION_STACK_OVERFLOW</p>
<p>是不是感觉很熟悉啊~~~呵呵~~~~~~~</p>
<p> </p>
<p>于是有了上面的这些东西，我们似乎就可以完成我们的程序了~~！！！之前还需要注意一点，无论子进程正确与否，总是要先抛出EXCEPTION_BREAKPOINT 异常，然后再弹出其他异常</p>
<p>所以，我们不能在抛出EXCEPTION_BREAKPOINT 异常的时候结束进程，还需要等待抛出第二个异常的时候，得到真正的异常信息。</p>
<p> </p>
<p>下面给出测试代码：</p>
<p> </p>
<p>这个程序可以捕获子进程的任何异常，并提示，而且子进程不会出现讨厌的对话框。。。。太久不写代码了。。。。写得很难看。。将就一下。。。</p>
<p> </p>
<p>//by c4pt0r~~~~任意转载~~随意转载~~</p>
<p>#include &lt;iostream&gt;<br>
#include&lt;windows.h&gt;<br>
using namespace std;<br>
int main()<br>
{<br>
&nbsp;&nbsp;&nbsp;  STARTUPINFO si;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  PROCESS_INFORMATION pi;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  si.cb = sizeof(STARTUPINFO);&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GetStartupInfo(&amp;si);&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  si.wShowWindow = SW_HIDE;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  char *Dir  = &quot;d:\\1.exe&quot;;<br>
&nbsp;&nbsp;&nbsp;  if(!CreateProcess(NULL,Dir,NULL,NULL,TRUE,DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&amp;si,&amp;pi))  <br>
&nbsp;&nbsp;&nbsp;  {&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  printf(&quot;Error on CreateProcess()&quot;);&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DEBUG_EVENT de;  <br>
&nbsp;&nbsp;&nbsp;  while (WaitForDebugEvent(&amp;de,INFINITE)!=0)  <br>
&nbsp;&nbsp;&nbsp;  {  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (de.dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT)  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  printf(&quot;create\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if (de.dwDebugEventCode == EXCEPTION_DEBUG_EVENT)  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  switch&nbsp;&nbsp;  (de.u.Exception.ExceptionRecord.ExceptionCode)  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  case&nbsp;&nbsp;  EXCEPTION_INT_DIVIDE_BY_ZERO:  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  printf(&quot;zero\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  TerminateProcess(pi.hProcess,1); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  case&nbsp;&nbsp;  EXCEPTION_INT_OVERFLOW:  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  printf(&quot;INT\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  TerminateProcess(pi.hProcess,1); <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  break;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  case&nbsp;&nbsp;  EXCEPTION_ACCESS_VIOLATION:  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  printf(&quot;ACCESS\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  TerminateProcess(pi.hProcess,1); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  case&nbsp;&nbsp;  EXCEPTION_DATATYPE_MISALIGNMENT:  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  printf(&quot;DATATYPE\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  TerminateProcess(pi.hProcess,1); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  case&nbsp;&nbsp;  EXCEPTION_FLT_STACK_CHECK:  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  printf(&quot;DATATYPE\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  TerminateProcess(pi.hProcess,1); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  case&nbsp;&nbsp;  EXCEPTION_INVALID_DISPOSITION:  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  printf(&quot;DISPOSITION\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  TerminateProcess(pi.hProcess,1); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;   case&nbsp;&nbsp;  EXCEPTION_STACK_OVERFLOW:  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  printf(&quot;OVERFLOW\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;  TerminateProcess(pi.hProcess,1); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  break;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  default:  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;   printf(&quot;exception\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  if&nbsp;&nbsp;  (de.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  {  <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  printf(&quot;exit\n&quot;);  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;    break;  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  }  <br>
&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,DBG_CONTINUE);  <br>
&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;  <br>
}</p> <a href="http://hi.baidu.com/c4pt0r/blog/item/b86d6b2d15785d33349bf7eb.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/b86d6b2d15785d33349bf7eb.html#comment">查看评论</a>]]></description>
        <pubDate>2008-12-23  12:05</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/b86d6b2d15785d33349bf7eb.html</guid>
</item>

<item>
        <title><![CDATA[关于UDP Hole Punching的一些东西]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/282b7429a73b11f898250a6e.html]]></link>
        <description><![CDATA[
		
		 昨天有朋友问关于UDP Hole Punching的一些基本概念,在这里稍微通俗解释下,所谓UDP Hole Punching就是传说中的内网穿透的打洞技术。两个拥有内网IP的计算机通过NAT连通是不能直接沟通的，必须通过一些特殊的手段，就是UPD Hole Punching，Hole Punching,也就是打洞。
<p>&nbsp;&nbsp;&nbsp;  在解释这个概念之前呢，先解释一下内网ip通过NAT访问外网的原理，首先内网ip的数据包会交给NAT，NAT随后修改数据包的原始ip地址，改成这个子网所对应外网的公网ip，接着呢，NAT就会在整个会话过程中维护一个&ldquo;映射&rdquo;。。。这个映射的存在时间不确定，如果是TCP的话就是从一个SYN包开始到FIN包结束，UDP就不确定了。。。。这个映射将将内网的端口和ip绑定到一个新分配的外网端口上，也就是说，我的内网ip是192.168.0.2通过1234端口访问58.154.193.212，同时我的WAN IP是58.154.193.54的话，那么NAT就会分配一个58.154.193.54：60000（也可以是其它端口，总之是随机分配的），将这个ip和端口绑定到我的内网ip和端口上。然后所有通过这个60000端口进来的数据都会转发到192.168.0.2的1234端口。</p>
<p>&nbsp;&nbsp;  上面的理论是很简单的，接下来就到关键的了，如何使得两个内网的ip互相通讯呢？现在我们有Client A和Client B两个内网用户。直接通讯是不可能的，因为互相都不可能知道NAT分配的端口，那该如何是好呢？很好，我们需要添加一个中转的Server C。。有点类似目录服务器。。。。。首先Client A向Server C发送连接请求，也就是向Server C方向打个洞，Server C将记录Client A的外网ip和端口，然后通知Client B，Client B是不是这个时候就可以通过这个地址肆无忌惮的向Client A发信息了呢？答案是否定的。。。。。基于安全方面的因素，Client A的NAT一般会丢弃这样的包。。。。那该如何是好呢？？？？？？那好，我们可以让Client A往Client B的NAT方向打洞。。。具体是这样的，Server C通知Client A，告诉他Client B的外网地址和端口，然后Client A向这个地址发送一个打洞包，发送完毕后，Client B就可以通过从Server C那里拿到的地址肆无忌惮的给Client A发东西了。。。。</p>
<p> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 大概就是这个意思。。。最最通俗的语言了。看不懂我就没办法了。。。。。。以前高中的时候写过一份代码，现在估计一时半会写不出来了。。。。老了。。。。囧。。。。。。</p> <a href="http://hi.baidu.com/c4pt0r/blog/item/282b7429a73b11f898250a6e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/282b7429a73b11f898250a6e.html#comment">查看评论</a>]]></description>
        <pubDate>2008-10-23  09:32</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/282b7429a73b11f898250a6e.html</guid>
</item>

<item>
        <title><![CDATA[尽量使用WaitForMultipleObjects替代WaitForSingleObjects]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/4111f231ec5efbae5edf0e1e.html]]></link>
        <description><![CDATA[
		
		<p>WaitForSingleObjects对于Thread数组来说相当于busy loop,因为假设结束顺序和创建顺序是一样的.这就带来了效率问题</p>
<p>/*<br>
written by c4pt0r<br>
for studing WaitForMultipleObjects<br>
*/</p>
<p>#include &lt;stdio.h&gt;<br>
#include &lt;stdlib.h&gt;<br>
#include &lt;windows.h&gt;</p>
<p>DWORD WINAPI ThreadFunc(LPVOID);</p>
<p>#define THREAD_POOL_SIZE 3<br>
#define MAX_THREAD_INDEX THREAD_POOL_SIZE-1<br>
#define NUM_TASK 6</p>
<p><br>
int main()<br>
{<br>
 HANDLE hThread[THREAD_POOL_SIZE];<br>
 int slot=0;<br>
 DWORD threadID;<br>
 int i;<br>
 DWORD exitcode;</p>
<p> for (i=1;i&lt;=NUM_TASK;i++)<br>
 {<br>
&nbsp;&nbsp; if (i &gt; THREAD_POOL_SIZE)  //if the number of the running thread is more than the pool size,then we wait <br>
&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; int rc=WaitForMultipleObjects(THREAD_POOL_SIZE,hThread,false,INFINITE);<br>
&nbsp;&nbsp;&nbsp; slot=rc - WAIT_OBJECT_0 ;<br>
&nbsp;&nbsp;&nbsp; printf(&quot;slot %d terminated!\n&quot;,slot);</p>
<p>&nbsp;&nbsp; }<br>
&nbsp;&nbsp; hThread[slot++]=CreateThread(NULL,0,ThreadFunc,(LPVOID)slot,NULL,&amp;threadID);<br>
&nbsp;&nbsp; printf(&quot;Launch %d \n&quot;,slot);<br>
&nbsp;&nbsp;  <br>
 }<br>
 WaitForMultipleObjects(THREAD_POOL_SIZE,hThread,true,INFINITE); //the main thread,wait for every thread</p>
<p> for (slot=0 ; slot&lt;THREAD_POOL_SIZE ; slot++)&nbsp;&nbsp;  <br>
&nbsp;&nbsp; CloseHandle(hThread[slot]);<br>
 printf(&quot;All thread terminated!\n&quot;);<br>
 return EXIT_SUCCESS;<br>
}</p>
<p> </p>
<p>DWORD WINAPI ThreadFunc(LPVOID n)<br>
{<br>
 srand(GetTickCount());<br>
 Sleep((rand()%8*500)+500);<br>
 printf(&quot;Slot %d idle\n&quot;,n);<br>
 return (DWORD)n;</p>
<p>}</p> <a href="http://hi.baidu.com/c4pt0r/blog/item/4111f231ec5efbae5edf0e1e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/4111f231ec5efbae5edf0e1e.html#comment">查看评论</a>]]></description>
        <pubDate>2008-10-07  11:00</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/4111f231ec5efbae5edf0e1e.html</guid>
</item>

<item>
        <title><![CDATA[百度面试~~~]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/583e57d861b0053333fa1cae.html]]></link>
        <description><![CDATA[
		
		&nbsp;&nbsp;&nbsp;  NS组的技术经理很和蔼可亲~~~~ 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/583e57d861b0053333fa1cae.html#comment">查看评论</a>]]></description>
        <pubDate>2008-09-25  06:47</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/583e57d861b0053333fa1cae.html</guid>
</item>

<item>
        <title><![CDATA[poj 2564]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/edcea8cd58763b570eb3455e.html]]></link>
        <description><![CDATA[
		
		<p>DP+二分</p>
<p>只二分i以前的字符串~~~</p>
<p> </p>
<pre class="sh_cpp sh_sourceCode"><span class="sh_preproc">#include</span> <span class="sh_string">&lt;iostream&gt;</span>
<span class="sh_preproc">#include</span> <span class="sh_string">&lt;cstring&gt;</span>
<span class="sh_preproc">#define</span> MAXX <span class="sh_number">25000</span>
<span class="sh_keyword">using</span> <span class="sh_keyword">namespace</span> std<span class="sh_symbol">;</span>
<span class="sh_type">char</span> dict<span class="sh_symbol">[</span>MAXX<span class="sh_symbol">][</span><span class="sh_number">20</span><span class="sh_symbol">];</span>
<span class="sh_type">char</span> CH<span class="sh_symbol">[]=</span><span class="sh_cbracket">{</span><span class="sh_string">'z'</span><span class="sh_symbol">,</span><span class="sh_string">'z'</span><span class="sh_symbol">,</span><span class="sh_string">'a'</span><span class="sh_cbracket">}</span><span class="sh_symbol">;</span>
<span class="sh_type">void</span> <span class="sh_function">add</span><span class="sh_symbol">(</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>src<span class="sh_symbol">,</span><span class="sh_type">int</span> k<span class="sh_symbol">,</span><span class="sh_type">char</span> ch<span class="sh_symbol">,</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>res<span class="sh_symbol">)</span>
<span class="sh_cbracket">{</span>
 <span class="sh_type">int</span> i<span class="sh_symbol">;</span>
 <span class="sh_keyword">for</span><span class="sh_symbol">(</span>i<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>i<span class="sh_symbol">&lt;</span>k<span class="sh_symbol">;</span>i<span class="sh_symbol">++)</span> res<span class="sh_symbol">[</span>i<span class="sh_symbol">]=</span>src<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>
 res<span class="sh_symbol">[</span>k<span class="sh_symbol">]=</span>ch<span class="sh_symbol">;</span>
 <span class="sh_keyword">for</span><span class="sh_symbol">(</span>i<span class="sh_symbol">=</span>k<span class="sh_symbol">;</span>src<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>i<span class="sh_symbol">++)</span> res<span class="sh_symbol">[</span>i<span class="sh_number">+1</span><span class="sh_symbol">]=</span>src<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>
 res<span class="sh_symbol">[</span>i<span class="sh_number">+1</span><span class="sh_symbol">]=</span><span class="sh_string">'</span><span class="sh_specialchar">\0</span><span class="sh_string">'</span><span class="sh_symbol">;</span>
 <span class="sh_keyword">return</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>
<span class="sh_type">void</span> <span class="sh_function">change</span><span class="sh_symbol">(</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>src<span class="sh_symbol">,</span><span class="sh_type">int</span> k<span class="sh_symbol">,</span><span class="sh_type">char</span> ch<span class="sh_symbol">,</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>res<span class="sh_symbol">)</span>
<span class="sh_cbracket">{</span>
 <span class="sh_type">int</span> i<span class="sh_symbol">;</span>
 <span class="sh_keyword">for</span><span class="sh_symbol">(</span>i<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>src<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>i<span class="sh_symbol">++)</span> res<span class="sh_symbol">[</span>i<span class="sh_symbol">]=</span>src<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>
 res<span class="sh_symbol">[</span>k<span class="sh_symbol">]=</span>ch<span class="sh_symbol">;</span>
 res<span class="sh_symbol">[</span>i<span class="sh_symbol">]=</span><span class="sh_string">'</span><span class="sh_specialchar">\0</span><span class="sh_string">'</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>
<span class="sh_type">void</span> <span class="sh_function">del</span><span class="sh_symbol">(</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>src<span class="sh_symbol">,</span><span class="sh_type">int</span> k<span class="sh_symbol">,</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>res<span class="sh_symbol">)</span>
<span class="sh_cbracket">{</span>
 <span class="sh_type">int</span> i<span class="sh_symbol">;</span>
 <span class="sh_keyword">for</span><span class="sh_symbol">(</span>i<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>i<span class="sh_symbol">&lt;</span>k<span class="sh_symbol">;</span>i<span class="sh_symbol">++)</span> res<span class="sh_symbol">[</span>i<span class="sh_symbol">]=</span>src<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>
 <span class="sh_keyword">for</span><span class="sh_symbol">(</span>i<span class="sh_symbol">=</span>k<span class="sh_number">+1</span><span class="sh_symbol">;</span>src<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>i<span class="sh_symbol">++)</span> res<span class="sh_symbol">[</span>i<span class="sh_number">-1</span><span class="sh_symbol">]=</span>src<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>
 res<span class="sh_symbol">[</span>i<span class="sh_number">-1</span><span class="sh_symbol">]=</span><span class="sh_string">'</span><span class="sh_specialchar">\0</span><span class="sh_string">'</span><span class="sh_symbol">;</span>
 <span class="sh_keyword">return</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>
<span class="sh_type">void</span> <span class="sh_function">edit</span><span class="sh_symbol">(</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>src<span class="sh_symbol">,</span><span class="sh_type">int</span> k<span class="sh_symbol">,</span><span class="sh_type">char</span> ch<span class="sh_symbol">,</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>res<span class="sh_symbol">,</span><span class="sh_type">int</span> type<span class="sh_symbol">)</span>
<span class="sh_cbracket">{</span>
 <span class="sh_keyword">switch</span><span class="sh_symbol">(</span>type<span class="sh_symbol">)</span>
 <span class="sh_cbracket">{</span>
 <span class="sh_keyword">case</span> <span class="sh_number">0</span><span class="sh_symbol">:</span>
  <span class="sh_function">add</span><span class="sh_symbol">(</span>src<span class="sh_symbol">,</span>k<span class="sh_symbol">,</span>ch<span class="sh_symbol">,</span>res<span class="sh_symbol">);</span>
  <span class="sh_keyword">break</span><span class="sh_symbol">;</span>
 <span class="sh_keyword">case</span> <span class="sh_number">1</span><span class="sh_symbol">:</span>
  <span class="sh_function">change</span><span class="sh_symbol">(</span>src<span class="sh_symbol">,</span>k<span class="sh_symbol">,</span>ch<span class="sh_symbol">,</span>res<span class="sh_symbol">);</span>
  <span class="sh_keyword">break</span><span class="sh_symbol">;</span>
 <span class="sh_keyword">case</span> <span class="sh_number">2</span><span class="sh_symbol">:</span>
  <span class="sh_function">del</span><span class="sh_symbol">(</span>src<span class="sh_symbol">,</span>k<span class="sh_symbol">,</span>res<span class="sh_symbol">);</span>
  <span class="sh_keyword">break</span><span class="sh_symbol">;</span>
 <span class="sh_cbracket">}</span>
 <span class="sh_keyword">return</span> <span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>

<span class="sh_type">int</span> <span class="sh_function">bsearch</span><span class="sh_symbol">(</span><span class="sh_type">char</span> <span class="sh_symbol">*</span>str<span class="sh_symbol">,</span><span class="sh_type">int</span> n<span class="sh_symbol">)</span>
<span class="sh_cbracket">{</span>
 <span class="sh_type">int</span> l<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">,</span>r<span class="sh_symbol">=</span>n<span class="sh_number">-1</span><span class="sh_symbol">,</span>mid<span class="sh_symbol">,</span>k<span class="sh_symbol">;</span>
 <span class="sh_keyword">if</span><span class="sh_symbol">(</span>l<span class="sh_symbol">&gt;</span>r<span class="sh_symbol">)</span> <span class="sh_keyword">return</span> <span class="sh_symbol">-</span><span class="sh_number">1</span><span class="sh_symbol">;</span>
 <span class="sh_keyword">while</span><span class="sh_symbol">(</span>l<span class="sh_symbol">&lt;=</span>r<span class="sh_symbol">)</span>
 <span class="sh_cbracket">{</span>
  mid<span class="sh_symbol">=(</span>l<span class="sh_symbol">+</span>r<span class="sh_symbol">)/</span><span class="sh_number">2</span><span class="sh_symbol">;</span>
  k<span class="sh_symbol">=</span><span class="sh_function">strcmp</span><span class="sh_symbol">(</span>dict<span class="sh_symbol">[</span>mid<span class="sh_symbol">],</span>str<span class="sh_symbol">);</span>
  <span class="sh_keyword">if</span><span class="sh_symbol">(</span>k<span class="sh_symbol">==</span><span class="sh_number">0</span><span class="sh_symbol">)</span> <span class="sh_keyword">return</span> mid<span class="sh_symbol">;</span>
  <span class="sh_keyword">if</span><span class="sh_symbol">(</span>k<span class="sh_symbol">&gt;</span><span class="sh_number">0</span><span class="sh_symbol">)</span> r<span class="sh_symbol">=</span>mid<span class="sh_number">-1</span><span class="sh_symbol">;</span>
  <span class="sh_keyword">else</span> l<span class="sh_symbol">=</span>mid<span class="sh_number">+1</span><span class="sh_symbol">;</span>
 <span class="sh_cbracket">}</span>
 <span class="sh_keyword">return</span> <span class="sh_symbol">-</span><span class="sh_number">1</span><span class="sh_symbol">;</span>

<span class="sh_cbracket">}</span>
<span class="sh_type">int</span> <span class="sh_function">main</span><span class="sh_symbol">()</span>
<span class="sh_cbracket">{</span>
 <span class="sh_type">int</span> n<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>
 <span class="sh_type">int</span> f<span class="sh_symbol">[</span>MAXX<span class="sh_symbol">]=</span><span class="sh_cbracket">{</span><span class="sh_number">0</span><span class="sh_cbracket">}</span><span class="sh_symbol">;</span>
 <span class="sh_type">int</span> maxx<span class="sh_symbol">=</span><span class="sh_number">1</span><span class="sh_symbol">;</span>
 <span class="sh_type">int</span> i<span class="sh_symbol">,</span>j<span class="sh_symbol">,</span>k<span class="sh_symbol">,</span>z<span class="sh_symbol">;</span>
 <span class="sh_keyword">while</span><span class="sh_symbol">(</span><span class="sh_function">scanf</span><span class="sh_symbol">(</span><span class="sh_string">&quot;%s&quot;</span><span class="sh_symbol">,</span>dict<span class="sh_symbol">[</span>n<span class="sh_symbol">])!=</span>EOF<span class="sh_symbol">)</span>
  n<span class="sh_symbol">++;</span>
 f<span class="sh_symbol">[</span><span class="sh_number">0</span><span class="sh_symbol">]=</span><span class="sh_number">1</span><span class="sh_symbol">;</span>
 <span class="sh_keyword">for</span><span class="sh_symbol">(</span>i<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>i<span class="sh_symbol">&lt;</span>n<span class="sh_symbol">;</span>i<span class="sh_symbol">++)</span>
 <span class="sh_cbracket">{</span>
  f<span class="sh_symbol">[</span>i<span class="sh_symbol">]=</span><span class="sh_number">1</span><span class="sh_symbol">;</span>
  <span class="sh_keyword">for</span><span class="sh_symbol">(</span>j<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>j<span class="sh_symbol">&lt;</span><span class="sh_number">3</span><span class="sh_symbol">;</span>j<span class="sh_symbol">++)</span>   <span class="sh_comment">//3种变换~~~~</span>
  <span class="sh_cbracket">{</span>
   <span class="sh_keyword">for</span><span class="sh_symbol">(</span>k<span class="sh_symbol">=</span><span class="sh_number">0</span><span class="sh_symbol">;</span>dict<span class="sh_symbol">[</span>i<span class="sh_symbol">][</span>k<span class="sh_symbol">];</span>k<span class="sh_symbol">++)</span>
   <span class="sh_cbracket">{</span>
    <span class="sh_type">char</span> tmp<span class="sh_symbol">[</span><span class="sh_number">20</span><span class="sh_symbol">];</span>
    <span class="sh_type">int</span> resi<span class="sh_symbol">;</span>
       <span class="sh_keyword">for</span><span class="sh_symbol">(</span><span class="sh_type">int</span> ch<span class="sh_symbol">=</span><span class="sh_string">'a'</span><span class="sh_symbol">;</span>ch<span class="sh_symbol">&lt;=</span>CH<span class="sh_symbol">[</span>j<span class="sh_symbol">];</span>ch<span class="sh_symbol">++)</span>
    <span class="sh_cbracket">{</span>
       <span class="sh_function">edit</span><span class="sh_symbol">(</span>dict<span class="sh_symbol">[</span>i<span class="sh_symbol">],</span>k<span class="sh_symbol">,</span>ch<span class="sh_symbol">,</span>tmp<span class="sh_symbol">,</span>j<span class="sh_symbol">);</span>
        
       <span class="sh_keyword">if</span><span class="sh_symbol">(</span><span class="sh_function">strcmp</span><span class="sh_symbol">(</span>tmp<span class="sh_symbol">,</span>dict<span class="sh_symbol">[</span>i<span class="sh_symbol">])&gt;=</span><span class="sh_number">0</span><span class="sh_symbol">)</span> <span class="sh_keyword">break</span><span class="sh_symbol">;</span>
       resi<span class="sh_symbol">=</span><span class="sh_function">bsearch</span><span class="sh_symbol">(</span>tmp<span class="sh_symbol">,</span>n<span class="sh_symbol">);</span>
        
       <span class="sh_keyword">if</span><span class="sh_symbol">(</span>resi<span class="sh_symbol">&gt;=</span><span class="sh_number">0</span> <span class="sh_symbol">&amp;&amp;</span> f<span class="sh_symbol">[</span>i<span class="sh_symbol">]&lt;</span>f<span class="sh_symbol">[</span>resi<span class="sh_symbol">]+</span><span class="sh_number">1</span><span class="sh_symbol">)</span>
       <span class="sh_cbracket">{</span>
        f<span class="sh_symbol">[</span>i<span class="sh_symbol">]=</span>f<span class="sh_symbol">[</span>resi<span class="sh_symbol">]+</span><span class="sh_number">1</span><span class="sh_symbol">;</span>
        <span class="sh_keyword">if</span><span class="sh_symbol">(</span>maxx<span class="sh_symbol">&lt;</span>f<span class="sh_symbol">[</span>i<span class="sh_symbol">])</span> maxx<span class="sh_symbol">=</span>f<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>
       <span class="sh_cbracket">}</span>
    <span class="sh_cbracket">}</span>
   <span class="sh_cbracket">}</span>
  <span class="sh_cbracket">}</span>
 <span class="sh_cbracket">}</span>
 <span class="sh_function">printf</span><span class="sh_symbol">(</span><span class="sh_string">&quot;%d</span><span class="sh_specialchar">\n</span><span class="sh_string">&quot;</span><span class="sh_symbol">,</span>maxx<span class="sh_symbol">);</span>
 
<span class="sh_cbracket">}</span></pre> <a href="http://hi.baidu.com/c4pt0r/blog/item/edcea8cd58763b570eb3455e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/edcea8cd58763b570eb3455e.html#comment">查看评论</a>]]></description>
        <pubDate>2008-09-18  09:06</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/edcea8cd58763b570eb3455e.html</guid>
</item>

<item>
        <title><![CDATA[最大流模板集合]]></title>
        <link><![CDATA[http://hi.baidu.com/c4pt0r/blog/item/11093ecf34dd0a3bf8dc6131.html]]></link>
        <description><![CDATA[
		
		<p>//求网络最大流,邻接阵形式<br>
//返回最大流量,flow返回每条边的流量<br>
//传入网络节点数n,容量mat,源点source,汇点sink</p>
<p>#define MAXN 100<br>
#define inf 1000000000</p>
<p>int max_flow(int n,int mat[][MAXN],int source,int sink,int flow[][MAXN]){<br>
 int pre[MAXN],que[MAXN],d[MAXN],p,q,t,i,j;<br>
 if (source==sink) return inf;<br>
 for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp; for (j=0;j&lt;n;flow[i][j++]=0);<br>
 for (;;){<br>
&nbsp;&nbsp; for (i=0;i&lt;n;pre[i++]=0);<br>
&nbsp;&nbsp; pre[t=source]=source+1,d[t]=inf;<br>
&nbsp;&nbsp; for (p=q=0;p&lt;=q&amp;&amp;!pre[sink];t=que[p++])<br>
&nbsp;&nbsp;&nbsp; for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (!pre[i]&amp;&amp;j=mat[t][i]-flow[t][i])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre[que[q++]=i]=t+1,d[i]=d[t]&lt;j?d[t]:j;<br>
&nbsp;&nbsp;&nbsp;&nbsp; else if (!pre[i]&amp;&amp;j=flow[i][t])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre[que[q++]=i]=-t-1,d[i]=d[t]&lt;j?d[t]:j;<br>
&nbsp;&nbsp; if (!pre[sink]) break;<br>
&nbsp;&nbsp; for (i=sink;i!=source;)<br>
&nbsp;&nbsp;&nbsp; if (pre[i]&gt;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp; flow[pre[i]-1][i]+=d[sink],i=pre[i]-1;<br>
&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp; flow[i][-pre[i]-1]-=d[sink],i=-pre[i]-1;<br>
 }<br>
 for (j=i=0;i&lt;n;j+=flow[source][i++]);<br>
 return j;<br>
}</p>
<p> </p>
<p> </p>
<p>最小费用最大流</p>
<p>//求网络最小费用最大流,邻接阵形式<br>
//返回最大流量,flow返回每条边的流量,netcost返回总费用<br>
//传入网络节点数n,容量mat,单位费用cost,源点source,汇点sink</p>
<p>#define MAXN 100<br>
#define inf 1000000000</p>
<p>int min_cost_max_flow(int n,int mat[][MAXN],int cost[][MAXN],int source,int sink,int flow[][MAXN],int&amp; netcost){<br>
 int pre[MAXN],min[MAXN],d[MAXN],i,j,t,tag;<br>
 if (source==sink) return inf;<br>
 for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp; for (j=0;j&lt;n;flow[i][j++]=0);<br>
 for (netcost=0;;){<br>
&nbsp;&nbsp; for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp;&nbsp; pre[i]=0,min[i]=inf;<br>
&nbsp;&nbsp; //通过bellman_ford寻找最短路，即最小费用可改进路<br>
&nbsp;&nbsp; for (pre[source]=source+1,min[source]=0,d[source]=inf,tag=1;tag;)<br>
&nbsp;&nbsp;&nbsp; for (tag=t=0;t&lt;n;t++)<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (d[t])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j=mat[t][i]-flow[t][i]&amp;&amp;min[t]+cost[t][i]&lt;min[i])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag=1,min[i]=min[t]+cost[t][i],pre[i]=t+1,d[i]=d[t]&lt;j?d[t]:j;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (j=flow[i][t]&amp;&amp;min[t]&lt;inf&amp;&amp;min[t]-cost[i][t]&lt;min[i])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tag=1,min[i]=min[t]-cost[i][t],pre[i]=-t-1,d[i]=d[t]&lt;j?d[t]:j;<br>
&nbsp;&nbsp; if (!pre[sink]) break;<br>
&nbsp;&nbsp; for (netcost+=min[sink]*d[i=sink];i!=source;)<br>
&nbsp;&nbsp;&nbsp; if (pre[i]&gt;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp; flow[pre[i]-1][i]+=d[sink],i=pre[i]-1;<br>
&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp; flow[i][-pre[i]-1]-=d[sink],i=-pre[i]-1;<br>
 }<br>
 for (j=i=0;i&lt;n;j+=flow[source][i++]);<br>
 return j;<br>
}</p>
<p>//求上下界网络最小流,邻接阵形式<br>
//返回最大流量,-1表示无可行流,flow返回每条边的流量<br>
//传入网络节点数n,容量mat,流量下界bf,源点source,汇点sink<br>
//MAXN应比最大结点数多2,无可行流返回-1时mat未复原!</p>
<p>#define MAXN 100<br>
#define inf 1000000000</p>
<p>void _max_flow(int n,int mat[][MAXN],int source,int sink,int flow[][MAXN]){<br>
 int pre[MAXN],que[MAXN],d[MAXN],p,q,t,i,j;<br>
 for (;;){<br>
&nbsp;&nbsp; for (i=0;i&lt;n;pre[i++]=0);<br>
&nbsp;&nbsp; pre[t=source]=source+1,d[t]=inf;<br>
&nbsp;&nbsp; for (p=q=0;p&lt;=q&amp;&amp;!pre[sink];t=que[p++])<br>
&nbsp;&nbsp;&nbsp; for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (!pre[i]&amp;&amp;j=mat[t][i]-flow[t][i])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre[que[q++]=i]=t+1,d[i]=d[t]&lt;j?d[t]:j;<br>
&nbsp;&nbsp;&nbsp;&nbsp; else if (!pre[i]&amp;&amp;j=flow[i][t])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre[que[q++]=i]=-t-1,d[i]=d[t]&lt;j?d[t]:j;<br>
&nbsp;&nbsp; if (!pre[sink]) break;<br>
&nbsp;&nbsp; for (i=sink;i!=source;)<br>
&nbsp;&nbsp;&nbsp; if (pre[i]&gt;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp; flow[pre[i]-1][i]+=d[sink],i=pre[i]-1;<br>
&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp; flow[i][-pre[i]-1]-=d[sink],i=-pre[i]-1;<br>
 }<br>
}</p>
<p>int limit_min_flow(int n,int mat[][MAXN],int bf[][MAXN],int source,int sink,int flow[][MAXN]){<br>
 int i,j,sk,ks;<br>
 if (source==sink) return inf;<br>
 for (mat[n][n+1]=mat[n+1][n]=mat[n][n]=mat[n+1][n+1]=i=0;i&lt;n;i++)<br>
&nbsp;&nbsp; for (mat[n][i]=mat[i][n]=mat[n+1][i]=mat[i][n+1]=j=0;j&lt;n;j++)<br>
&nbsp;&nbsp;&nbsp; mat[i][j]-=bf[i][j],mat[n][i]+=bf[j][i],mat[i][n+1]+=bf[i][j];<br>
 sk=mat[source][sink],ks=mat[sink][source],mat[source][sink]=mat[sink][source]=inf;<br>
 for (i=0;i&lt;n+2;i++)<br>
&nbsp;&nbsp; for (j=0;j&lt;n+2;flow[i][j++]=0);<br>
 _max_flow(n+2,mat,n,n+1,flow);<br>
 for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp; if (flow[n][i]&lt;mat[n][i]) return -1;<br>
 flow[source][sink]=flow[sink][source]=0,mat[source][sink]=sk,mat[sink][source]=ks;<br>
 _max_flow(n,mat,sink,source,flow);<br>
 for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp; for (j=0;j&lt;n;j++)<br>
&nbsp;&nbsp;&nbsp; mat[i][j]+=bf[i][j],flow[i][j]+=bf[i][j];<br>
 for (j=i=0;i&lt;n;j+=flow[source][i++]);<br>
 return j;<br>
}</p>
<p>//求上下界网络最大流,邻接阵形式<br>
//返回最大流量,-1表示无可行流,flow返回每条边的流量<br>
//传入网络节点数n,容量mat,流量下界bf,源点source,汇点sink<br>
//MAXN应比最大结点数多2,无可行流返回-1时mat未复原!</p>
<p>#define MAXN 100<br>
#define inf 1000000000</p>
<p>void _max_flow(int n,int mat[][MAXN],int source,int sink,int flow[][MAXN]){<br>
 int pre[MAXN],que[MAXN],d[MAXN],p,q,t,i,j;<br>
 for (;;){<br>
&nbsp;&nbsp; for (i=0;i&lt;n;pre[i++]=0);<br>
&nbsp;&nbsp; pre[t=source]=source+1,d[t]=inf;<br>
&nbsp;&nbsp; for (p=q=0;p&lt;=q&amp;&amp;!pre[sink];t=que[p++])<br>
&nbsp;&nbsp;&nbsp; for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp;&nbsp;&nbsp; if (!pre[i]&amp;&amp;j=mat[t][i]-flow[t][i])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre[que[q++]=i]=t+1,d[i]=d[t]&lt;j?d[t]:j;<br>
&nbsp;&nbsp;&nbsp;&nbsp; else if (!pre[i]&amp;&amp;j=flow[i][t])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pre[que[q++]=i]=-t-1,d[i]=d[t]&lt;j?d[t]:j;<br>
&nbsp;&nbsp; if (!pre[sink]) break;<br>
&nbsp;&nbsp; for (i=sink;i!=source;)<br>
&nbsp;&nbsp;&nbsp; if (pre[i]&gt;0)<br>
&nbsp;&nbsp;&nbsp;&nbsp; flow[pre[i]-1][i]+=d[sink],i=pre[i]-1;<br>
&nbsp;&nbsp;&nbsp; else<br>
&nbsp;&nbsp;&nbsp;&nbsp; flow[i][-pre[i]-1]-=d[sink],i=-pre[i]-1;<br>
 } <br>
}</p>
<p>int limit_max_flow(int n,int mat[][MAXN],int bf[][MAXN],int source,int sink,int flow[][MAXN]){<br>
 int i,j,sk,ks;<br>
 if (source==sink) return inf;<br>
 for (mat[n][n+1]=mat[n+1][n]=mat[n][n]=mat[n+1][n+1]=i=0;i&lt;n;i++)<br>
&nbsp;&nbsp; for (mat[n][i]=mat[i][n]=mat[n+1][i]=mat[i][n+1]=j=0;j&lt;n;j++)<br>
&nbsp;&nbsp;&nbsp; mat[i][j]-=bf[i][j],mat[n][i]+=bf[j][i],mat[i][n+1]+=bf[i][j];<br>
 sk=mat[source][sink],ks=mat[sink][source],mat[source][sink]=mat[sink][source]=inf;<br>
 for (i=0;i&lt;n+2;i++)<br>
&nbsp;&nbsp; for (j=0;j&lt;n+2;flow[i][j++]=0);<br>
 _max_flow(n+2,mat,n,n+1,flow);<br>
 for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp; if (flow[n][i]&lt;mat[n][i]) return -1;<br>
 flow[source][sink]=flow[sink][source]=0,mat[source][sink]=sk,mat[sink][source]=ks;<br>
 _max_flow(n,mat,source,sink,flow);<br>
 for (i=0;i&lt;n;i++)<br>
&nbsp;&nbsp; for (j=0;j&lt;n;j++)<br>
&nbsp;&nbsp;&nbsp; mat[i][j]+=bf[i][j],flow[i][j]+=bf[i][j];<br>
 for (j=i=0;i&lt;n;j+=flow[source][i++]);<br>
 return j;<br>
}</p> <a href="http://hi.baidu.com/c4pt0r/blog/item/11093ecf34dd0a3bf8dc6131.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/c4pt0r/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/c4pt0r/blog/item/11093ecf34dd0a3bf8dc6131.html#comment">查看评论</a>]]></description>
        <pubDate>2008-09-10  13:33</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[c4pt0r]]></author>
		<guid>http://hi.baidu.com/c4pt0r/blog/item/11093ecf34dd0a3bf8dc6131.html</guid>
</item>


</channel>
</rss>