﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-付翔的专栏-随笔分类-ACM 图论</title><link>http://www.cppblog.com/397993401/category/13854.html</link><description>在鄙视中成长 记录成长的点滴</description><language>zh-cn</language><lastBuildDate>Fri, 03 Sep 2010 01:28:58 GMT</lastBuildDate><pubDate>Fri, 03 Sep 2010 01:28:58 GMT</pubDate><ttl>60</ttl><item><title>hdu 1102  prim 最小生成树</title><link>http://www.cppblog.com/397993401/archive/2010/09/02/125706.html</link><dc:creator>付翔</dc:creator><author>付翔</author><pubDate>Thu, 02 Sep 2010 15:48:00 GMT</pubDate><guid>http://www.cppblog.com/397993401/archive/2010/09/02/125706.html</guid><wfw:comment>http://www.cppblog.com/397993401/comments/125706.html</wfw:comment><comments>http://www.cppblog.com/397993401/archive/2010/09/02/125706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/397993401/comments/commentRss/125706.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/397993401/services/trackbacks/125706.html</trackback:ping><description><![CDATA[&nbsp;
<h1 style="color: #1a5cc8; text-align: center;">Constructing Roads</h1>
<font><strong>Time Limit: 2000/1000 MS (Java/Others)&nbsp;&nbsp;&nbsp;&nbsp;Memory Limit: 65536/32768 K (Java/Others)<br>Total Submission(s): 3780&nbsp;&nbsp;&nbsp;&nbsp;Accepted Submission(s): 1298<br></strong></font><br><br>
<div class="panel_title" style="padding: 0px 14px; height: 38px; background-image: url(http://acm.hdu.edu.cn/images/panel-title.png); background-color: transparent; color: #7ca9ed; font-size: 18px; font-family: arial; font-weight: bold; background-position: 0% 100%;" align="left">Problem Description</div>
<div class="panel_content" style="margin: 0px; padding: 0px 20px; height: auto; background-image: url(http://acm.hdu.edu.cn/images/panel-content.png); font-size: 14px; font-family: 'Times New Roman'; text-align: left;">There are N villages, which are numbered from 1 to N, and you should build some roads such that every two villages can connect to each other. We say two village A and B are connected, if and only if there is a road between A and B, or there exists a village C such that there is a road between A and C, and C and B are connected.&nbsp;<br><br>We know that there are already some roads between some villages and your job is the build some roads such that all the villages are connect and the length of all the roads built is minimum.<br></div>
<div class="panel_bottom" style="margin: 0px; height: auto; background-image: url(http://acm.hdu.edu.cn/images/panel-bottom.png); background-position: 0% 0%;">&nbsp;</div>
<br>
<div class="panel_title" style="padding: 0px 14px; height: 38px; background-image: url(http://acm.hdu.edu.cn/images/panel-title.png); background-color: transparent; color: #7ca9ed; font-size: 18px; font-family: arial; font-weight: bold; background-position: 0% 100%;" align="left">Input</div>
<div class="panel_content" style="margin: 0px; padding: 0px 20px; height: auto; background-image: url(http://acm.hdu.edu.cn/images/panel-content.png); font-size: 14px; font-family: 'Times New Roman'; text-align: left;">The first line is an integer N (3 &lt;= N &lt;= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j.<br><br>Then there is an integer Q (0 &lt;= Q &lt;= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 &lt;= a &lt; b &lt;= N), which means the road between village a and village b has been built.<br></div>
<br>
<div class="panel_title" style="padding: 0px 14px; height: 38px; background-image: url(http://acm.hdu.edu.cn/images/panel-title.png); background-color: transparent; color: #7ca9ed; font-size: 18px; font-family: arial; font-weight: bold; background-position: 0% 100%;" align="left">Output</div>
<div class="panel_content" style="margin: 0px; padding: 0px 20px; height: auto; background-image: url(http://acm.hdu.edu.cn/images/panel-content.png); font-size: 14px; font-family: 'Times New Roman'; text-align: left;">You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum. <br></div>
<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;infinity&nbsp;123456789</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;max_vertexes&nbsp;100&nbsp;</span><span style="color: #000000;"><br><br>typedef&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Graph[max_vertexes][max_vertexes];<br><br>Graph&nbsp;G;<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;total;<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;lowcost[max_vertexes],closeset[max_vertexes],used[max_vertexes];<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;father[max_vertexes];<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;prim(Graph&nbsp;G,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;vcount)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,j,k;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;min&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;infinity;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vcount;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lowcost[i]</span><span style="color: #000000;">=</span><span style="color: #000000;">G[</span><span style="color: #000000;">0</span><span style="color: #000000;">][i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeset[i]</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[i]</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father[i]</span><span style="color: #000000;">=-</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;used[</span><span style="color: #000000;">0</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vcount;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(used[j])&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;lowcost[j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(k</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;k</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vcount;k</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((</span><span style="color: #000000;">!</span><span style="color: #000000;">used[k])</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">(lowcost[k]</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">min))&nbsp;<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;&nbsp;min&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">lowcost[k];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j</span><span style="color: #000000;">=</span><span style="color: #000000;">k;<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;father[j]</span><span style="color: #000000;">=</span><span style="color: #000000;">closeset[j];&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[j]</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;min;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(k</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;k</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vcount;k</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">used[k]</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">(G[j][k]</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">lowcost[k]))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lowcost[k]</span><span style="color: #000000;">=</span><span style="color: #000000;">G[j][k];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeset[k]</span><span style="color: #000000;">=</span><span style="color: #000000;">j;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;N,i,j,Q;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,y;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(cin</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">N)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;N;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;N;&nbsp;j&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">G[i][j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">Q;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;Q;&nbsp;i&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">x</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">y;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[x</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">][y</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[y</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">][x</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prim(G,N);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;total</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br><br><img src ="http://www.cppblog.com/397993401/aggbug/125706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/397993401/" target="_blank">付翔</a> 2010-09-02 23:48 <a href="http://www.cppblog.com/397993401/archive/2010/09/02/125706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有向图强连通分量</title><link>http://www.cppblog.com/397993401/archive/2010/05/20/115966.html</link><dc:creator>付翔</dc:creator><author>付翔</author><pubDate>Thu, 20 May 2010 12:28:00 GMT</pubDate><guid>http://www.cppblog.com/397993401/archive/2010/05/20/115966.html</guid><wfw:comment>http://www.cppblog.com/397993401/comments/115966.html</wfw:comment><comments>http://www.cppblog.com/397993401/archive/2010/05/20/115966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/397993401/comments/commentRss/115966.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/397993401/services/trackbacks/115966.html</trackback:ping><description><![CDATA[<h3 style="margin: 10px 0px 5px; font-family: sans-serif; font-style: normal; font-variant: normal; font-weight: bold; font-size: 170%; line-height: 100%; font-size-adjust: none; font-stretch: normal; color: #758d38;">
<p style="margin: 0px 0px 10px; padding: 0px; line-height: 22px;">转自：</p>
<p style="margin: 0px 0px 10px; padding: 0px; line-height: 22px;"><a href="http://www.byvoid.com/blog/scc-tarjan/" style="line-height: 22px; text-decoration: none; color: #556c88;">http://www.byvoid.com/blog/scc-tarjan/ <br></a></p>
<p style="margin: 0px 0px 10px; padding: 0px; line-height: 22px;"><a href="http://www.byvoid.com/blog/scc-tarjan/" style="line-height: 22px; text-decoration: none; color: #556c88;"><br></a></p>
<br><strong> </strong></h3>
<h3 style="margin: 10px 0px 5px; font-family: sans-serif; font-style: normal; font-variant: normal; font-weight: bold; font-size: 170%; line-height: 100%; font-size-adjust: none; font-stretch: normal; color: #758d38;"><strong>[有向图强连通分量]</strong> </h3>
<p style="margin: 0px; padding: 0px 0px 15px;">在有向图G中，如果两个顶点间至少存在一条路径，称两个顶点<strong> 强连通</strong> (strongly connected)。如果有向图G的每两个顶点都强连通，称G是一个<strong> 强连通图</strong> 。非强连通图有向图的极大强连通子图，称为<strong> 强连通分量</strong> (strongly connected components)。</p>
<p style="margin: 0px; padding: 0px 0px 15px;">下图中，子图{1,2,3,4}为一个强连通分量，因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。</p>
<p style="margin: 0px; padding: 0px 0px 15px;"><img title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image1.png" alt="image" style="border-width: 0px; display: inline;" width="320" border="0" height="201"></p>
<p style="margin: 0px; padding: 0px 0px 15px;">直接根据定义，用双向遍历取交集的方法求强连通分量，时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法，两者的时间复杂度都是O(N+M)。本文介绍的是Tarjan算法。</p>
<h3 style="margin: 10px 0px 5px; font-family: sans-serif; font-style: normal; font-variant: normal; font-weight: bold; font-size: 170%; line-height: 100%; font-size-adjust: none; font-stretch: normal; color: #758d38;"><strong> [Tarjan算法]</strong> </h3>
<p style="margin: 0px; padding: 0px 0px 15px;">Tarjan算法是基于对图深度优先搜索的算法，每个强连通分量为搜索树中的一棵子树。搜索时，把当前搜索树中未处理的节点加入一个堆栈，回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。</p>
<p style="margin: 0px; padding: 0px 0px 15px;">定义DFN(u)为节点u搜索的次序编号(时间戳)，Low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号。由定义可以得出，</p>
<div class="wp_codebox_msgheader" style="border-width: 1px 1px 0px; border-top: 1px solid silver; border-left: 1px solid silver; border-right: 1px solid silver; margin: 0.5em 0px 0px; overflow: hidden; width: 671px; height: 22px; font-weight: bold; background-image: url(http://www.byvoid.com/blog/wp-content/plugins/wp-codebox/images/arrow-square.gif); background-color: #f3f8d7; color: #000000; background-position: 100% 5px;"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox howto?" style="color: #cc6600; text-decoration: none; font-family: Arial,Tahoma ! important; font-style: normal ! important; font-variant: normal ! important; font-weight: normal ! important; font-size: 14px ! important; line-height: normal ! important; font-size-adjust: none ! important; font-stretch: normal ! important;">?</a></sup><a href="javascript:;" onclick="javascript:showCodeTxt('p1235code1'); return false;" style="color: #cc6600; text-decoration: none; font-weight: bold;">View Code</a>&nbsp;CPP</div>
<div class="wp_codebox" style="border: 1px solid silver; margin: 0px 0px 0.5em; overflow: auto; color: #110000; width: 671px; background-color: #f9f9f9;">
<table style="margin: 0px ! important; border-collapse: collapse; width: 671px;">
    <tbody>
        <tr id="p12351">
            <td class="code" id="p1235code1" style="padding: 2px 4px; vertical-align: top;">
            <pre class="cpp" style="border-style: none; margin: 0px; padding: 0px; overflow: visible; background-image: none; width: auto; float: none; clear: none; font-size: 12px; line-height: 1.333; text-align: left; font-family: monospace;">Low(u)=Min<br>{<br>    DFN(u),<br>    Low(v),(u,v)为树枝边，u为v的父节点<br>    DFN(v),(u,v)为指向栈中节点的后向边(非横叉边)<br>}</pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin: 0px; padding: 0px 0px 15px;">当DFN(u)=Low(u)时，以u为根的搜索子树上所有节点是一个强连通分量。</p>
<p style="margin: 0px; padding: 0px 0px 15px;">算法伪代码如下</p>
<div class="wp_codebox_msgheader" style="border-width: 1px 1px 0px; border-top: 1px solid silver; border-left: 1px solid silver; border-right: 1px solid silver; margin: 0.5em 0px 0px; overflow: hidden; width: 671px; height: 22px; font-weight: bold; background-image: url(http://www.byvoid.com/blog/wp-content/plugins/wp-codebox/images/arrow-square.gif); background-color: #f3f8d7; color: #000000; background-position: 100% 5px;"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox howto?" style="color: #cc6600; text-decoration: none; font-family: Arial,Tahoma ! important; font-style: normal ! important; font-variant: normal ! important; font-weight: normal ! important; font-size: 14px ! important; line-height: normal ! important; font-size-adjust: none ! important; font-stretch: normal ! important;">?</a></sup><a href="javascript:;" onclick="javascript:showCodeTxt('p1235code2'); return false;" style="color: #cc6600; text-decoration: none; font-weight: bold;">View Code</a>&nbsp;CPP</div>
<div class="wp_codebox" style="border: 1px solid silver; margin: 0px 0px 0.5em; overflow: auto; color: #110000; width: 671px; background-color: #f9f9f9;">
<table style="margin: 0px ! important; border-collapse: collapse; width: 671px;">
    <tbody>
        <tr id="p12352">
            <td class="code" id="p1235code2" style="padding: 2px 4px; vertical-align: top;">
            <pre class="cpp" style="border-style: none; margin: 0px; padding: 0px; overflow: visible; background-image: none; width: auto; float: none; clear: none; font-size: 12px; line-height: 1.333; text-align: left; font-family: monospace;">tarjan(u)<br>{<br>	DFN[u]=Low[u]=++Index                      // 为节点u设定次序编号和Low初值<br>	Stack.push(u)                              // 将节点u压入栈中<br>	for each (u, v) in E                       // 枚举每一条边<br>		if (v is not visted)               // 如果节点v未被访问过<br>			tarjan(v)                  // 继续向下找<br>			Low[u] = min(Low[u], Low[v])<br>		else if (v in S)                   // 如果节点v还在栈内<br>			Low[u] = min(Low[u], DFN[v])<br>	if (DFN[u] == Low[u])                      // 如果节点u是强连通分量的根<br>		repeat<br>			v = S.pop                  // 将v退栈，为该强连通分量中一个顶点<br>			print v<br>		until (u== v)<br>}</pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin: 0px; padding: 0px 0px 15px;">接下来是对算法流程的演示。</p>
<p style="margin: 0px; padding: 0px 0px 15px;">从节点1开始DFS，把遍历到的节点加入栈中。搜索到节点u=6时，DFN[6]=LOW[6]，找到了一个强连通分量。退栈到u=v为止，{6}为一个强连通分量。</p>
<p style="margin: 0px; padding: 0px 0px 15px;"><img title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image2.png" alt="image" style="border-width: 0px; display: inline;" width="523" border="0" height="305"></p>
<p style="margin: 0px; padding: 0px 0px 15px;">返回节点5，发现DFN[5]=LOW[5]，退栈后{5}为一个强连通分量。</p>
<p style="margin: 0px; padding: 0px 0px 15px;"><img title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image3.png" alt="image" style="border-width: 0px; display: inline;" width="523" border="0" height="335"></p>
<p style="margin: 0px; padding: 0px 0px 15px;">返回节点3，继续搜索到节点4，把4加入堆栈。发现节点4向节点1有后向边，节点1还在栈中，所以LOW[4]=1。节点6已经出栈，(4,6)是横叉边，返回3，(3,4)为树枝边，所以LOW[3]=LOW[4]=1。</p>
<p style="margin: 0px; padding: 0px 0px 15px;"><img title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image4.png" alt="image" style="border-width: 0px; display: inline;" width="523" border="0" height="335"></p>
<p style="margin: 0px; padding: 0px 0px 15px;">继续回到节点1，最后访问节点2。访问边(2,4)，4还在栈中，所以LOW[2]=DFN[4]=5。返回1后，发现DFN[1]=LOW[1]，把栈中节点全部取出，组成一个连通分量{1,3,4,2}。</p>
<p style="margin: 0px; padding: 0px 0px 15px;"><img title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image5.png" alt="image" style="border-width: 0px; display: inline;" width="523" border="0" height="335"></p>
<p style="margin: 0px; padding: 0px 0px 15px;">至此，算法结束。经过该算法，求出了图中全部的三个强连通分量{1,3,4,2},{5},{6}。</p>
<p style="margin: 0px; padding: 0px 0px 15px;">可以发现，运行Tarjan算法的过程中，每个顶点都被访问了一次，且只进出了一次堆栈，每条边也只被访问了一次，所以该算法的时间复杂度为O(N+M)。</p>
<p style="margin: 0px; padding: 0px 0px 15px;">求有向图的强连通分量还有一个强有力的算法，为Kosaraju算法。Kosaraju是基于对有向图及其逆图两次DFS的方法，其时间复杂度也是O(N+M)。与Trajan算法相比，Kosaraju算法可能会稍微更直观一些。但是Tarjan只用对原图进行一次DFS，不用建立逆图，更简洁。在实际的测试中，Tarjan算法的运行效率也比Kosaraju算法高30%左右。此外，该Tarjan算法与<a href="http://www.byvoid.com/blog/biconnect/" target="_blank" style="color: #cc6600; text-decoration: none;">求无向图的双连通分量(割点、桥)的Tarjan算法</a>也有着很深的联系。学习该Tarjan算法，也有助于深入理解求双连通分量的Tarjan算法，两者可以类比、组合理解。</p>
<p style="margin: 0px; padding: 0px 0px 15px;">求有向图的强连通分量的Tarjan算法是以其发明者<a href="http://en.wikipedia.org/wiki/Robert_Tarjan" target="_blank" style="color: #cc6600; text-decoration: none;">Robert Tarjan</a>命名的。Robert Tarjan还发明了求<a href="http://www.byvoid.com/blog/biconnect/" target="_blank" style="color: #cc6600; text-decoration: none;">双连通分量</a>的Tarjan算法，以及求最近公共祖先的离线Tarjan算法，在此对Tarjan表示崇高的敬意。</p>
<p style="margin: 0px; padding: 0px 0px 15px;">附：tarjan算法的C++程序</p>
<div class="wp_codebox_msgheader" style="border-width: 1px 1px 0px; border-top: 1px solid silver; border-left: 1px solid silver; border-right: 1px solid silver; margin: 0.5em 0px 0px; overflow: hidden; width: 671px; height: 22px; font-weight: bold; background-image: url(http://www.byvoid.com/blog/wp-content/plugins/wp-codebox/images/arrow-square.gif); background-color: #f3f8d7; color: #000000; background-position: 100% 5px;"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox howto?" style="color: #cc6600; text-decoration: none; font-family: Arial,Tahoma ! important; font-style: normal ! important; font-variant: normal ! important; font-weight: normal ! important; font-size: 14px ! important; line-height: normal ! important; font-size-adjust: none ! important; font-stretch: normal ! important;">?</a></sup><a href="javascript:;" onclick="javascript:showCodeTxt('p1235code3'); return false;" style="color: #cc6600; text-decoration: none; font-weight: bold;">View Code</a>&nbsp;CPP</div>
<div class="wp_codebox" style="border: 1px solid silver; margin: 0px 0px 0.5em; overflow: auto; color: #110000; width: 671px; background-color: #f9f9f9;">
<table style="margin: 0px ! important; border-collapse: collapse; width: 671px;">
    <tbody>
        <tr id="p12353">
            <td class="line_numbers" style="padding: 2px 4px; overflow: visible; vertical-align: top; text-align: right; background-color: #ddeeff; color: #666666; table-layout: auto; width: 10px;">
            <pre style="border-style: none; margin: 0px; padding: 0px; overflow: visible; background-image: none; width: auto; float: none; clear: none; font-size: 12px; line-height: 1.333; text-align: right;">1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br></pre>
            </td>
            <td class="code" id="p1235code3" style="padding: 2px 4px; vertical-align: top;">
            <pre class="cpp" style="border-style: none; margin: 0px; padding: 0px; overflow: visible; background-image: none; width: auto; float: none; clear: none; font-size: 12px; line-height: 1.333; text-align: left; font-family: monospace;">void tarjan(int i)<br>{<br>	int j;<br>	DFN[i]=LOW[i]=++Dindex;<br>	instack[i]=true;<br>	Stap[++Stop]=i;<br>	for (edge *e=V[i];e;e=e-&gt;next)<br>	{<br>		j=e-&gt;t;<br>		if (!DFN[j])<br>		{<br>			tarjan(j);<br>			if (LOW[j]&lt;LOW[i])<br>				LOW[i]=LOW[j];<br>		}<br>		else if (instack[j] &amp;&amp; DFN[j]&lt;LOW[i])<br>			LOW[i]=DFN[j];<br>	}<br>	if (DFN[i]==LOW[i])<br>	{<br>		Bcnt++;<br>		do<br>		{<br>			j=Stap[Stop--];<br>			instack[j]=false;<br>			Belong[j]=Bcnt;<br>		}<br>		while (j!=i);<br>	}<br>}<br>void solve()<br>{<br>	int i;<br>	Stop=Bcnt=Dindex=0;<br>	memset(DFN,0,sizeof(DFN));<br>	for (i=1;i&lt;=N;i++)<br>		if (!DFN[i])<br>			tarjan(i);<br>}</pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<br><img src ="http://www.cppblog.com/397993401/aggbug/115966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/397993401/" target="_blank">付翔</a> 2010-05-20 20:28 <a href="http://www.cppblog.com/397993401/archive/2010/05/20/115966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdu 1285 确定比赛名次</title><link>http://www.cppblog.com/397993401/archive/2010/05/19/115856.html</link><dc:creator>付翔</dc:creator><author>付翔</author><pubDate>Wed, 19 May 2010 15:56:00 GMT</pubDate><guid>http://www.cppblog.com/397993401/archive/2010/05/19/115856.html</guid><wfw:comment>http://www.cppblog.com/397993401/comments/115856.html</wfw:comment><comments>http://www.cppblog.com/397993401/archive/2010/05/19/115856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/397993401/comments/commentRss/115856.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/397993401/services/trackbacks/115856.html</trackback:ping><description><![CDATA[这次是自己仿写的 图的模板 而写的拓扑排序 <br><br>和其他用矩阵的稍有不同<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">采用临界表的形式&nbsp;但是用数组来实现&nbsp;其中要用C++&nbsp;的队列stl&nbsp;尽量使代码的可用度提高<br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;网上大多采用&nbsp;临接矩阵的方式来做的</span><span style="color: #008000;"><br></span><span style="color: #000000;">#&nbsp;include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">cstdio</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#&nbsp;include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#&nbsp;include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">queue</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#&nbsp;include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">vector</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;std;<br></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;maxn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">510</span><span style="color: #000000;">;<br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;graph<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;edge[maxn][maxn];</span><span style="color: #008000;">//</span><span style="color: #008000;">edge[i][j]&nbsp;表示第i个节点&nbsp;第&nbsp;j+1个边&nbsp;其值表示该边的顶点</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;outdegree[maxn&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">];</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;顶点的出度</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nvert&nbsp;;</span><span style="color: #008000;">//</span><span style="color: #008000;">节点数</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nedge;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;边数&nbsp;&nbsp;注意定点我们是从1&nbsp;开始算&nbsp;然后边数我们是从0&nbsp;开始的</span><span style="color: #008000;"><br></span><span style="color: #000000;">};<br>typedef&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;graph&nbsp;GRAPH;<br><br></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;graph&nbsp;g;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;图的全局变量</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init_graph()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;g.nedge&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;g.nvert&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">maxn&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;)&nbsp;g.outdegree[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;inert_graph(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y,</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;flag&nbsp;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">if(g.outdegree[x]&nbsp;&gt;&nbsp;maxn&nbsp;)</span><span style="color: #008000;">//</span><span style="color: #008000;">容错</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;g.edge[x][g.outdegree[x]]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;y;<br>&nbsp;&nbsp;&nbsp;&nbsp;g.outdegree[x]&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">出度&nbsp;+&nbsp;1</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(flag&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">)&nbsp;&nbsp;inert_graph(y,x,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">如果是无向图&nbsp;反向也要加</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;g.nedge&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">边数&nbsp;++</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;read_graph(</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;flag)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">flag&nbsp;用来控制&nbsp;是否是有向图</span><span style="color: #008000;"><br></span><span style="color: #000000;">{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这里可以根据实际情况添加代码</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;n,i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,y;<br>&nbsp;&nbsp;&nbsp;&nbsp;init_graph();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">g.nvert,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">n)</span><span style="color: #000000;">==</span><span style="color: #000000;">EOF)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;n;&nbsp;i&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">x,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inert_graph(x,y,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">是有向图</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">拓扑排序&nbsp;&nbsp;下面是top&nbsp;排序所需要的东东</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;sorted[maxn];<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;indegree[maxn];&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">计算入度</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;visted[maxn];<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;topsorted()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;queue</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;zeroin;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,y;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,j;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初试化&nbsp;入度数组</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;maxn&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;&nbsp;indegree[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">计算入度</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;g.nvert&nbsp;;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;g.outdegree[i];&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;所以这里我们是从&nbsp;0&nbsp;开始</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indegree[g.edge[i][j]]&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;g.nvert&nbsp;;&nbsp;i&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">for&nbsp;(i&nbsp;=&nbsp;g.nvert;&nbsp;i&nbsp;&gt;=&nbsp;1&nbsp;;&nbsp;i&nbsp;--)</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(indegree[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;zeroin.push(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(visted,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(visted));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;j&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;g.nvert;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)//&nbsp; 因为题目的原因 放弃队列<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">g.nvert;i</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(visted[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;indegree[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<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;&nbsp;sorted[j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i,visted[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;k</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;g.outdegree[i];k</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indegree[g.edge[i][k]]</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">if(j&nbsp;!=&nbsp;g.nvert)&nbsp;;</span><span style="color: #008000;">//</span><span style="color: #008000;">表明只有&nbsp;j个定点找到</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;print_graph()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i,j;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;g.nvert;&nbsp;i&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;g.nvert&nbsp;;&nbsp;j&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,g.edge[i][j]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000;">"</span><span style="color: #000000;">in.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">r</span><span style="color: #000000;">"</span><span style="color: #000000;">,stdin);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(read_graph(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;topsorted();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">print_graph();</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;g.nvert;&nbsp;i&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(i</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">?</span><span style="color: #000000;">"</span><span style="color: #000000;">%d</span><span style="color: #000000;">"</span><span style="color: #000000;">:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,sorted[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br><br></span></div>
<br><br> <img src ="http://www.cppblog.com/397993401/aggbug/115856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/397993401/" target="_blank">付翔</a> 2010-05-19 23:56 <a href="http://www.cppblog.com/397993401/archive/2010/05/19/115856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>