﻿<?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++博客-Smile-文章分类-多校联赛题解</title><link>http://www.cppblog.com/Smile3/category/17318.html</link><description>Smile</description><language>zh-cn</language><lastBuildDate>Thu, 17 Nov 2011 03:00:21 GMT</lastBuildDate><pubDate>Thu, 17 Nov 2011 03:00:21 GMT</pubDate><ttl>60</ttl><item><title>BIT 第三场 The King’s Problem</title><link>http://www.cppblog.com/Smile3/articles/151498.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Wed, 20 Jul 2011 10:47:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151498.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151498.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151498.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151498.html</trackback:ping><description><![CDATA[<div>知识点：强连通分量、缩点、再加用最大二分匹配求最小路径覆盖。<br />bug处：突然发现没有模板自己敲的时候巨多的错误，比如说求强连通分量时连反向表都没有建，再比如说求二分匹配的时候在一个图里表示两个图的时候应是flag标记数组写不好，注意是在if(0== flag[b[i][j]])之后写flag[b[i][j]] = 1;因为此时是j点在交错路上面。最后是没有想清楚那个最小路径覆盖的数目应该是缩点之后的有向无环图的点的个数，即强连通分量的个数减去最大匹配数。<br />思维：觉得还是知识点懂得太少了，并且现场有点怕，不敢去啃这个题目，我觉得比较好的策略是我们把简单题目做完之后就选定一道题目，啃，我觉得自己这方面没有做好，随着我们知识系统的完善，我觉得我们应该每一次都努力的啃一道难题出来。<br /><br />#include&lt;iostream&gt;<br />#include&lt;cstdio&gt;<br />#include&lt;cstring&gt;<br />#include&lt;vector&gt;<br /><br />using namespace std;<br /><br />#define max 5010<br />int n,m;<br />vector&lt;int&gt; a[max],b[max],adjact[max];<br />int flag[5010];<br />int id[max];<br />int result[max];<br />int pipe[max];<br /><br />void initone()//初始化注意建反向图<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(a,0,sizeof(a));<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(adjact,0,sizeof(adjact));<br />&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;n,&amp;m);<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=m; i++ )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int aa,bb;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;aa,&amp;bb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[aa].push_back(bb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adjact[bb].push_back(aa);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />}<br /><br />void vistone(int i,int &amp;sig)//第一次深度优先搜索，注意其中的id为改点的最后离开时间，所以id的赋值应该要放到递归的后面，注意sig的&amp;符号<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = a[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[a[i][j]] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(a[i][j],sig);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; id[++sig] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp; return;<br />}<br /><br />void visttwo(int i,int sig)//注意此时用到的图为反向之后的图<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; result[i] = sig;<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = adjact[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[adjact[i][j]] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(adjact[i][j],sig);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />int f()//用来求强连通分量，首先对原图dfs一次，记住每个点的离开时间，然后按离开时间从大到小再对反向图dfs一次，注意第二次的sig要自增。<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(id,0,sizeof(id));<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp;&nbsp; int sig = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=n; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[i] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(i,sig);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; sig = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=n; i&gt;=1; --i )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[ id[i] ] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(id[i],++sig);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return sig;<br />}<br /><br />void inittwo( )//建缩点之后的图，注意此时建成之后的图中的点应该是强连通分量。所以注意建图过程中的赋值。<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(b,0,sizeof(b));<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=n; i++ )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num = a[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( result[i] != result[a[i][j]] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[result[i]].push_back(result[a[i][j]]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return;<br />}<br /><br />bool find(int i)//注意find函数中的flag赋值处，pipe数组的赋值，只要单向赋值。<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = b[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[b[i][j]] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag[b[i][j]] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == pipe[b[i][j]] || find( pipe[b[i][j]] ) )<br />&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; pipe[b[i][j]] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; false;<br />}<br />&nbsp;<br />int hungary(int ss)//注意每一次调用find之前都要将flag数组中的元素赋为0.<br />{<br />&nbsp;&nbsp;&nbsp; int sum = 0;<br />&nbsp;&nbsp;&nbsp; memset(pipe,0,sizeof(pipe));<br />&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=ss; i++ )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( find(i) )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return sum;<br />}&nbsp;&nbsp; &nbsp;<br /><br />int main()<br />{<br />&nbsp;&nbsp; int t;<br />&nbsp;&nbsp; scanf("%d",&amp;t);<br />&nbsp;&nbsp; while( t-- )<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initone();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ss = f();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inittwo();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nn = hungary(ss);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",ss-nn);<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-20 18:47 <a href="http://www.cppblog.com/Smile3/articles/151498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hnu第一场  Cat vs. Dog《最大二分匹配 匈牙利算法》</title><link>http://www.cppblog.com/Smile3/articles/151294.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Mon, 18 Jul 2011 04:06:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151294.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151294.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151294.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151294.html</trackback:ping><description><![CDATA[<div>重点：在于建图，建好图之后就一个纯裸的二分匹配。<br />知识：匈牙利算法 注意 最大独立集是集合的总元素个数减去最大二分匹配数<br />bug：此题无bug处，数据如果要符合实际情况，无法出特殊数据，要卡只能卡时间。<br /><br />#include&lt;cstdio&gt;//此次建图是建的二分图，上面一篇文章是用的一个图求二分匹配。<br />#include&lt;cstring&gt;<br />#include&lt;vector&gt;<br />using namespace std;<br /><br />#define max 510<br />int ch1[max][2];<br />int ch2[max][2];<br />int flag[max];<br />int vy[max];<br />int vx[max];<br />vector&lt;int&gt; p1[max];<br />int num1,num2;<br />int p,m,n;<br /><br />void init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; char a,b;<br />&nbsp;&nbsp;&nbsp;&nbsp; int d,c;<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(p1,0,sizeof(p1));<br />&nbsp;&nbsp;&nbsp;&nbsp; num1 = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp; num2 = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d%d",&amp;m,&amp;n,&amp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=p; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%c%d %c%d",&amp;a,&amp;c,&amp;b,&amp;d);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 'C' == a )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch1[++num1][0] = c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch1[num1][1] = d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch2[++num2][0] = c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch2[num2][1] = d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=num1; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=1; j&lt;=num2; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( ch1[i][0] == ch2[j][1] || ch1[i][1] == ch2[j][0] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p1[i].push_back(j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br />} <br /><br />bool find(int i)//注意flag数组的赋值<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = p1[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ p1[i][j] ] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag[ p1[i][j] ] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( vy[ p1[i][j] ] == 0 || find( vy[ p1[i][j] ] ) )<br />&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; vx[i] = p1[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vy[ p1[i][j] ] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; return&nbsp; false;<br />}<br /><br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; int t;<br />&nbsp;&nbsp;&nbsp; scanf("%d",&amp;t);<br />&nbsp;&nbsp;&nbsp; while( t-- )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sig = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(vx,0,sizeof(vx));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(vy,0,sizeof(vy));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=num1; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( find(i) )<br />&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; sig ++;<br />&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; printf("%d\n",p-sig);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-18 12:06 <a href="http://www.cppblog.com/Smile3/articles/151294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hnu第一场   Equivalent Sets  强连通分量 添加边使其成为一个强连通分量</title><link>http://www.cppblog.com/Smile3/articles/151071.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Fri, 15 Jul 2011 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151071.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151071.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151071.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151071.html</trackback:ping><description><![CDATA[<div>考察知识点：强连通分量的的求法<br />bug：注意强连通分量个数只有一个的情况<br />思维：这个转化倒是知道，但是知识点不足，还有一个更重要的是邻接表的写法和邻接矩阵的写法有很多的不同，特别是在第二次dfs的时候注意元素的表示不是i了而应该是<div> for( int i= 0; i&lt;num; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ b[cur][i] ] == 0&nbsp; )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(b[cur][i],sig);<br />再贴一个tyvj的纯裸的强连通分量：tvvj1111<br /><div>#include&lt;cstdio&gt;<br />#include&lt;cstring&gt;<br />#include&lt;iostream&gt;<br />using namespace std;<br />#define&nbsp; max 210<br />int a[max][max],b[max][max];//a为图G的邻接矩阵，b为图G的反图的邻接矩阵<br />int&nbsp; bleg[max];<br />int flag[max];<br />int numb[max];<br />int n;<br />void vistone(int cur,int &amp;sig)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[cur] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[i] == 0 &amp;&amp; a[cur][i] == 1 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(i,sig );<br />&nbsp;&nbsp;&nbsp;&nbsp; numb[++sig] = cur;<br />}<br />void visttwo( int cur ,int sig)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[cur] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; bleg[cur] =sig;<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i= 1; i&lt;=n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[i] == 0 &amp;&amp; b[cur][i] == 1 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(i,sig);<br />}&nbsp;&nbsp;&nbsp; &nbsp;<br />int korareju()<br />{<br />&nbsp;&nbsp;&nbsp; int sig =0;<br />&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp; for( int i=1;i&lt;=n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[i] == 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(i,sig);<br />&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp; sig=0;<br />&nbsp;&nbsp;&nbsp; for(int i=n; i&gt;=1; --i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ numb [i] ] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(numb[i], (++sig) );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return sig;<br />}<br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; scanf("%d",&amp;n);<br />&nbsp;&nbsp;&nbsp; int i = 0;<br />&nbsp;&nbsp;&nbsp; memset(a,0,sizeof(a));<br />&nbsp;&nbsp;&nbsp; memset(b,0,sizeof(b));<br />&nbsp;&nbsp;&nbsp; while( (i++)&lt;n )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while( true )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( x == 0)<br />&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; a[i][x] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[x][i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; int w = korareju();<br />&nbsp;&nbsp;&nbsp; printf("%d\n",w);<br />&nbsp;&nbsp;&nbsp; return 0;<br />}<br />&nbsp;&nbsp;&nbsp;</div><br /><br /></div>#include&lt;cstdio&gt;<br />#include&lt;cstring&gt;<br />#include&lt;iostream&gt;<br />#include&lt;vector&gt;<br />using namespace std;<br />#define&nbsp; max 20010<br />vector&lt; int &gt; a[max],b[max];//a为图G的邻接矩阵，b为图G的反图的邻接矩阵<br />int&nbsp; bleg[max];<br />int flag[max];<br />int numb[max];<br />int out[max];<br />int in[max];<br />int n;<br />void vistone(int cur,int &amp;sig)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[cur] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = a[cur].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;num; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ a[cur][i] ] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(a[cur][i],sig );<br />&nbsp;&nbsp;&nbsp;&nbsp; numb[++sig] = cur;<br />}<br />void visttwo( int cur ,int sig)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[cur] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; bleg[cur] =sig;<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = b[cur].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i= 0; i&lt;num; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ b[cur][i] ] == 0&nbsp; )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(b[cur][i],sig);<br />}&nbsp;&nbsp;&nbsp; &nbsp;<br />int korareju()<br />{<br />&nbsp;&nbsp;&nbsp; int sig =0;<br />&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp; for( int i=1;i&lt;=n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[i] == 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(i,sig);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp; sig=0;<br />&nbsp;&nbsp;&nbsp; for(int i=n; i&gt;=1; --i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ numb[i] ] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo( numb[i], (++sig) );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return sig;<br />}<br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; int m;<br />&nbsp;&nbsp;&nbsp; while( scanf("%d%d",&amp;n,&amp;m) == 2 )<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; int k = 0;<br />&nbsp;&nbsp;&nbsp; memset(a,0,sizeof(a));<br />&nbsp;&nbsp;&nbsp; memset(b,0,sizeof(b));<br />&nbsp;&nbsp;&nbsp; memset(numb,0,sizeof(numb));<br />&nbsp;&nbsp;&nbsp; memset(out,0,sizeof(out));<br />&nbsp;&nbsp;&nbsp; memset(in,0,sizeof(in));<br />&nbsp;&nbsp;&nbsp; memset(bleg,0,sizeof(bleg));<br />&nbsp;&nbsp;&nbsp; while( (k++)&lt;m )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x,y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;x,&amp;y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[x].push_back(y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[y].push_back(x);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; if( n &lt;= 1 )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("0\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; int w = korareju();<br />&nbsp;&nbsp;&nbsp; if( w == 1 )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("0\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=n; ++i )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num = a[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0; j&lt;num; ++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( bleg[i] != bleg[ a[i][j] ] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out[bleg[i]]++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in[ bleg[ a[i][j] ] ]++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; int od=0;<br />&nbsp;&nbsp;&nbsp; int id=0;<br />&nbsp;&nbsp;&nbsp; for( int i= 1; i&lt;=w; ++i)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( out[i] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; od++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( in[i] == 0 ) &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; int max0=od;<br />&nbsp;&nbsp;&nbsp; if(max0&lt;id)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max0=id;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; printf("%d\n",max0);<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-15 17:22 <a href="http://www.cppblog.com/Smile3/articles/151071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hnu第一场  Earth Hour 《单源最短路》</title><link>http://www.cppblog.com/Smile3/articles/151069.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Fri, 15 Jul 2011 08:51:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151069.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151069.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151069.html</trackback:ping><description><![CDATA[<div>这是一个单源最短路的变形，枚举的是关节点；<br />小技巧：在开始用三次dijstra算法求出三个关键点到所有其他点的距离，保存下来，枚举关节点时就不要每一次都求解，以节省时间，否则会超时。<br />思维：这里卡的是转换过程，另外一个是知识点，对于知识点现在已经学过了，以后要加油，对于思维的转化，还是要靠经验的积累和考场的思考。<br />#include&lt;cstdio&gt;<br />#include&lt;iostream&gt;<br />#include&lt;cstring&gt;<br />using namespace std;<br />#define INF 10000000<br />int a[210][3];<br />int l[210][210];<br />int d1[210],d2[210],d3[210];<br />void initiate(int n)<br />{<br />&nbsp;&nbsp; for( int i=0; i&lt;n; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0; j&lt;n; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int r = a[i][2]+a[j][2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len = ( a[i][0] - a[j][0] )*( a[i][0] - a[j][0] ) + ( a[i][1] - a[j][1] )*( a[i][1] - a[j][1] );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( r*r &gt;= len )<br />&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; l[i][j] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l[j][i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l[i][i]=0;<br />} <br />void dijstra(int i,int n,int d[])//每一次选取已有集合的最小d值,更新其他d值<br />{<br />&nbsp;&nbsp; d[i] = 0;<br />&nbsp;&nbsp; int flag[210];<br />&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp; int tt=n;<br />&nbsp;&nbsp; while( tt-- )<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int max =INF ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0; j&lt; n; j++ )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( d[j] &lt; max &amp;&amp; (flag[j] == 0) )<br />&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; max = d[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num = j;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag[num] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int t=0; t&lt;n; ++t )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[t] == 0 &amp;&amp; l[num][t] == 1 )<br />&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; if( d[t] &gt; (d[num]+1) )<br />&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; d[t] = d[num]+1;<br />&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; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; int t;<br />&nbsp;&nbsp;&nbsp; scanf("%d",&amp;t);<br />&nbsp;&nbsp;&nbsp; while( t-- )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(l,0,sizeof(l));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //printf("n:%d\n",n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;n; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d%d",&amp;a[i][0],&amp;a[i][1],&amp;a[i][2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int w=n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initiate(w);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int k=0; k&lt;210; ++k )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d1[k] = INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d2[k] = INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d3[k] = INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijstra(0,n,d1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijstra(1,n,d2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijstra(2,n,d3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int min =INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;n; ++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( min &gt; d1[j]+d2[j]+d3[j] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min = d1[j]+d2[j]+d3[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( min == INF )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("-1\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",(n-min-1));<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-15 16:51 <a href="http://www.cppblog.com/Smile3/articles/151069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>