??xml version="1.0" encoding="utf-8" standalone="yes"?>好久久免费视频高清,国产成人无码精品久久久性色,久久亚洲AV永久无码精品http://www.shnenglu.com/MatoNo1/category/16322.htmlMato是一只超U大沙茶……但他一直以来都x为各Ҏ赛都No.1的神犇…?/description>zh-cnMon, 03 Dec 2012 23:45:52 GMTMon, 03 Dec 2012 23:45:52 GMT60【AHOI2013复仇】关于线D|下标的一U优化表C法http://www.shnenglu.com/MatoNo1/archive/2012/12/01/195857.htmlMato_No1Mato_No1Sat, 01 Dec 2012 04:11:00 GMThttp://www.shnenglu.com/MatoNo1/archive/2012/12/01/195857.htmlhttp://www.shnenglu.com/MatoNo1/comments/195857.htmlhttp://www.shnenglu.com/MatoNo1/archive/2012/12/01/195857.html#Feedback0http://www.shnenglu.com/MatoNo1/comments/commentRss/195857.htmlhttp://www.shnenglu.com/MatoNo1/services/trackbacks/195857.html根结点:1
A的左子结点:2AQ写成A<<1Q?br />A的右子结点:2A+1Q写?A<<1)+1Q?br />q种表示法可以表C出整棵U段树,因ؓQ?br />Q?Q每个结点的子结点的下标都比它大Q这样就不会出现环;
Q?Q每个结点的父结炚w是唯一的(其本w下标整?Q;
但是Q这U表C法有一个弱点:l点的下标是有可能超q?N的,但不会超q?NQ因此,Z表示度ؓN的线D,我们需要开4N的空_然而,其中只有2N-1个位|是有用的(因ؓ表示跨度为N的线D늚U段树共?2N-1)个结点)Q?span style="color: red">q样Q就有一半的I间被浪?/strong>。尤其是q种U段树推q到多维的时?#8212;—Kl线D|只?/2K的位|是有用的,I间利用率非怽。在某些卡空间的场合Q它囧掉了?br />
那么Q有木有好一点的写法呢?最好能使空间利用率辑ֈ100%——也就是所有结点的下标刚好是1~(2N-1)Q!Q?L点一般作?#8220;哨兵”Q不被占用)
q且Q这U写法要保证仅仅q点的下标和它表示的线D늚左右端点Q因为在遍历U段Ӟ下标和左右端点基本上都是同时知道的)Q就能得出其子结点的下标Q而不需要借助额外的东东(最好mid都不需要算Q?br />q种写法是——直接每个结点的DFS遍历ơ序当做它的下标Q!
比如Q跨度ؓ6的线D|Q?br />
Ҏ发现Q根l点下标?Q下标ؓA的结点的左子l点下标?A+1)Q右子结点下标ؓA+SZ(A.L)+1Q其中SZ(A.L)为A的左子树大小?br />若A的左右端点ؓl、rQmid=(l+r)/2Q下取整Q,则A的左子树所表示的线Dؓ[l, mid]Q所以SZ(A.L)=(mid-l+1)*2-1=(mid-l)*2+1=((r-l-1)/2Q上取整Q?*2+1
q样QA的右子结点下标就是A+((r-l+1)/2Q上取整))*2Q也是A加上大于(r-l)的最的偶数Q?br />写在代码里就是:
int mid=l+r>>1;
opr(l, mid, A
+1);
opr(mid
+1, r, (r-l&1?A+r-l+1:A+r-l+2));
或者,借助位运,可以免去条g判断Q?
int mid=l+r>>1;
opr(l, mid, A
+1);
opr(mid
+1, r, A+r-l+2-((r^l)&1));
l测试,后者(使用位运的Q虽然ȝq算ơ数多于前者(使用条g判断的)Q但后者比前者快一点点Q其原因可能与C语言中的条gq算W速度较慢有关Q?br />
q样Q我们就成功地将U段树下标的I间利用率提高到?00%Q!以后只需要开2NI间p了囧……
与传l表C法相比Q这U新式表C法虽然可以节省I间Q但旉消耗要更大一些(旉和空间L矛盾的囧……Q,因ؓ它在扑֏子结点的时候需要较多的q算。^均v来,新式表示法比传统表示法要?0~15%Q对于某些坑爹的数据Q对叛_l点调用比较多的那种Q可能慢得更多。此外,在下放标记的时候,传统表示法只需要知道结点下标就行了Q而新式表C法必须同时知道l点的左右端点,q样在dm中就需要传递三个参敎ͼ从而要慢一些,当然Q我们可以不用dmQ直接在操作里面写标C放?img src ="http://www.shnenglu.com/MatoNo1/aggbug/195857.html" width = "1" height = "1" />

Mato_No1 2012-12-01 12:11 发表评论
]]>
【NOI2005 l护数列(sequence)】Splay Tree处理序列问题http://www.shnenglu.com/MatoNo1/archive/2011/06/21/149121.htmlMato_No1Mato_No1Tue, 21 Jun 2011 08:06:00 GMThttp://www.shnenglu.com/MatoNo1/archive/2011/06/21/149121.htmlhttp://www.shnenglu.com/MatoNo1/comments/149121.htmlhttp://www.shnenglu.com/MatoNo1/archive/2011/06/21/149121.html#Feedback0http://www.shnenglu.com/MatoNo1/comments/commentRss/149121.htmlhttp://www.shnenglu.com/MatoNo1/services/trackbacks/149121.html【原题见q里?br />本题是Splay Tree处理序列问题Q也是当线D|用)的一个典型例题?br />
Splay Tree之所以可以当U段树用Q是因ؓ它可以支持一个序列,然后?#8220;左端前趋伸展到根Q右端后l展到根的叛_l点Q取根的叛_l点的左子结?#8221;q种伸展ҎQ对一个序列中的一整段q行整体操作。由于要防止出现前趋或后l不存在的情况,需要在q个序列的两端加入两个边界结点,要求其g能媄响到l点各种记蝲信息的维护(多取0?#8734;?∞Q。这两个边界l点在树中永q存在,不会被删除?br />
Q?Q结点的引用Q?br />在当U段树用的Splay Tree中,真正的关键字是下标而不是|因此Q?#8220;序列中第i个结?#8221;实际上对应的?#8220;树中W?i+1)的l点”Q因为左边还有一个边界结点)Q这p明在对结点引用时需要找WK的操作。因此,下面?#8220;l点x”指的?#8220;树中W?x+1)的l点”?br />Q?Q标讎ͼ
在线D|中,如果对一个结Ҏ表示的线D|体进行了某种操作Q需要在q个l点上打上一个标讎ͼ在下一ơ再扑ֈq个l点Ӟ其标记就会下攑ֈ其两个子l点上。在Splay Tree中也可以引入标记。比如要对[2, 6]q一D进行整体操作,将l点1伸展到根的位|,结?伸展到根的右子树的位|,然后l点7的左子树pC[2, 6]q一D,对这子树的根结Ҏ上标记ƈ立即生效Q必L立即生效Q而不是等下一ơ引用再生效Q,也就是立x变该l点记录的一些信息的倹{如果下ơ再ơ引用到q个l点Q就要将其标C攑ֈ其两个子l点处;
需要注意的一ҎQ如果要伸展某个l点x到r的子l点的位|,必M证从x原来的位|到r的这个子l点Qx伸展后的位置Q上的所有结点上均没有标讎ͼ否则׃D标记混ؕ。因此,必须首先扑ֈq个l点xQ在此过E中不断下放标记?br />Q?Q自底向上维护的信息Q?br />标记可以看成一U自向下维护的信息。除了标C外,作ؓ“U段?#8221;Q往往q要l护一些自底向上维护的信息。比如在sequenceq题中,有lmaxQ左D连l最大和Q、rmaxQ右D连l最大和Q、midmaxQ全D连l最大和Q以及sumQ全D|dQ等信息要维护。对于这cM东其实也很好办,因ؓ子树大小Qsz域)是一U自底向上维护的信息Q因此对于这些信息只要按照维护sz域的办法l护卛_Q统一写在upd函数里)。唯一的不同点是打标记时它们的值可能要改变?br />Q?Q对q箋插入的结点徏树:
本题的插入不是一个一个插入,而是一下子插入一整段Q因此需要先它们徏成一|。一般徏树操作都是递归的,q里也一栗设目前要对A[l..r]建树QA为待插入序列Q,若l>r则退出,否则扑ֈ位于中间的元素mid = l + r >> 1Q将A[mid]作根Q再对A[l..mid-1]建左子树Q对A[mid+1..r]建右子树卛_。这样可以保证一开始徏的就是一^衡树Q减常数因子?br />Q?Q回收空_
Ҏ本题的数据范围提C,插入的结ҎL最多可能达?000000Q但在Q何时L中最多只?00002个结点(包括两个边界Q,此时Z节省I间Q可以采用@环队列回收空间的Ҏ。即Q一开始将所有的可用I间Q可用下标,本题?~500002Q存在@环队列Q里,同时讄头尾指针front和rearQ每ơ如果有新结Ҏ入,取出Q[front]q作为新l点的下标,如果有结点要删除Q本题是一ơ删除整子树,因此在删除后需要分别回收它们的I间Q,则从rear开始,每个删除的l点的下标放回到Q里。当Ӟq种Ҏ是要牺牲一定的旉的,因此在空间不是特别吃紧的情况下不要用?br />
?012q??6日更新?br />今天重写sequence的时候,U然发现加入的边界点可能会对lmax、rmax、midmax{的l护造成影响Q当序列中所有的值都是负数时Q若边界点的D?Q将使这3个g?Q所以,边界点的值应设ؓ-INFQ不会媄响到sumQ因为可以单独调出[l, r]的sumQ避开边界Q。这p明ƈ非所有这L题中都可以设|边界点Q比如HFTSC2011的那题就不行Q,如果边界点会对维护的信息造成影响Q就不能讄边界点,在各个操作中Q分4U情况判断。(代码已经修改Q?br />
下面上代码了Q?
#include <iostream>
#include 
<stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
const int MAXN = 500002, NOSM = -2000, INF = ~0U >> 2;
struct node {
    
int v, c[2], p, sz, sum, lmax, rmax, midmax, sm;
    
bool rev, d;
} T[MAXN 
+ 1];
int root, Q[MAXN + 1], front, rear, a[MAXN], len, res;
int max(int SS0, int SS1)
{
    
return SS0 >= SS1 ? SS0 : SS1;
}
int max(int SS0, int SS1, int SS2)
{
    
int M0 = SS0 >= SS1 ? SS0 : SS1; return M0 >= SS2 ? M0 : SS2;
}
void newnode(int n, int _v)
{
    T[n].v 
= T[n].sum = T[n].lmax = T[n].rmax = T[n].midmax = _v; T[n].c[0= T[n].c[1= 0; T[n].sz = 1; T[n].sm = NOSM; T[n].rev = 0;
}
void sc(int _p, int _c, bool _d)
{
    T[_p].c[_d] 
= _c; T[_c].p = _p; T[_c].d = _d;
}
void sm_opr(int x, int SM)
{
    T[x].sum 
= T[x].sz * SM;
    
if (SM > 0) T[x].lmax = T[x].rmax = T[x].midmax = T[x].sum; else T[x].lmax = T[x].rmax = T[x].midmax = SM;
}
void rev_opr(int x)
{
    
int c0 = T[x].c[0], c1 = T[x].c[1]; sc(x, c0, 1); sc(x, c1, 0);
    
int tmp = T[x].lmax; T[x].lmax = T[x].rmax; T[x].rmax = tmp;
}
void dm(int x)
{
    
int SM0 = T[x].sm;
    
if (SM0 != NOSM) {
        T[x].v 
= T[T[x].c[0]].sm = T[T[x].c[1]].sm = SM0; T[x].sm = NOSM;
        sm_opr(T[x].c[
0], SM0); sm_opr(T[x].c[1], SM0);
    }
    
if (T[x].rev) {
        T[T[x].c[
0]].rev = !T[T[x].c[0]].rev; T[T[x].c[1]].rev = !T[T[x].c[1]].rev; T[x].rev = 0;
        rev_opr(T[x].c[
0]); rev_opr(T[x].c[1]);
    }
}
void upd(int x)
{
    
int c0 = T[x].c[0], c1 = T[x].c[1];
    T[x].sz 
= T[c0].sz + T[c1].sz + 1;
    T[x].sum 
= T[c0].sum + T[c1].sum + T[x].v;
    T[x].lmax 
= max(T[c0].lmax, T[c0].sum + T[x].v + max(T[c1].lmax, 0));
    T[x].rmax 
= max(T[c1].rmax, max(T[c0].rmax, 0+ T[x].v + T[c1].sum);
    T[x].midmax 
= max(T[c0].midmax, T[c1].midmax, max(T[c0].rmax, 0+ T[x].v + max(T[c1].lmax, 0));
}
void rot(int x)
{
    
int y = T[x].p; bool d = T[x].d;
    
if (y == root) {root = x; T[root].p = 0;} else sc(T[y].p, x, T[y].d);
    sc(y, T[x].c[
!d], d); sc(x, y, !d); upd(y);
}
void splay(int x, int r)
{
    
int p; while ((p = T[x].p) != r) if (T[p].p == r) rot(x); else if (T[x].d == T[p].d) {rot(p); rot(x);} else {rot(x); rot(x);} upd(x);
}
int Find_Kth(int K)
{
    
int i = root, S0;
    
while (i) {
        dm(i); S0 
= T[T[i].c[0]].sz + 1;
        
if (K == S0) breakelse if (K < S0) i = T[i].c[0]; else {K -= S0; i = T[i].c[1];}
    }
    
return i;
}
int mkt(int l, int r)
{
    
if (l > r) return 0;
    
int n0 = Q[front], mid = l + r >> 1if (front == MAXN) front = 1else front++;
    newnode(n0, a[mid]); 
int l_r = mkt(l, mid - 1), r_r = mkt(mid + 1, r);
    sc(n0, l_r, 
0); sc(n0, r_r, 1); upd(n0); return n0;
}
void ins(int pos)
{
    
int P0 = Find_Kth(pos); splay(P0, 0); int P1 = Find_Kth(pos + 1); splay(P1, root); sc(P1, mkt(0, len - 1), 0); upd(P1); upd(P0);
}
void era(int x)
{
    
if (!x) return;
    
if (rear == MAXN) rear = 1else rear++; Q[rear] = x;
    era(T[x].c[
0]); era(T[x].c[1]);
}
void del(int l, int r)
{
    
int P0 = Find_Kth(l - 1); splay(P0, 0); int P1 = Find_Kth(r + 1); splay(P1, root); 
    
int root0 = T[P1].c[0]; sc(P1, 00); upd(P1); upd(P0); era(root0);
}
void mksame(int l, int r, int x)
{
    
int P0 = Find_Kth(l - 1); splay(P0, 0); int P1 = Find_Kth(r + 1); splay(P1, root); 
    
int n = T[P1].c[0]; T[n].sm = x; sm_opr(n, x); upd(P1); upd(P0);
}
void reve(int l, int r)
{
    
int P0 = Find_Kth(l - 1); splay(P0, 0); int P1 = Find_Kth(r + 1); splay(P1, root); 
    
int n = T[P1].c[0]; T[n].rev = !T[n].rev; rev_opr(n); upd(P1); upd(P0);
}
int get_sum(int l, int r)
{
    
int P0 = Find_Kth(l - 1); splay(P0, 0); int P1 = Find_Kth(r + 1); splay(P1, root); 
    
int n = T[P1].c[0]; return T[n].sum;
}
int max_sum()
{
    
return T[root].midmax;
}
void prepare()
{
    T[
0].sz = T[0].sum = T[0].lmax = T[0].rmax = T[0].midmax = 0;
    front 
= 3; rear = MAXN; re1(i, MAXN) Q[i] = i;
    newnode(
1-INF); newnode(2-INF); sc(121); root = 1; T[root].p = 0;
}
int main()
{
    freopen(
"sequence.in""r", stdin);
    freopen(
"sequence.out""w", stdout);
    prepare();
    
int m, l, r, x;
    scanf(
"%d%d"&len, &m); char ch = getchar(), str[1000];
    re(i, len) scanf(
"%d"&a[i]); ins(1);
    re(i, m) {
        scanf(
"%s", str);
        
if (!strcmp(str, "INSERT")) {scanf("%d%d"&l, &len); re(i, len) scanf("%d"&a[i]); ins(++l);}
        
if (!strcmp(str, "DELETE")) {scanf("%d%d"&l, &r); r += l++; del(l, r);}
        
if (!strcmp(str, "MAKE-SAME")) {scanf("%d%d%d"&l, &r, &x); r += l++; mksame(l, r, x);}
        
if (!strcmp(str, "REVERSE")) {scanf("%d%d"&l, &r); r += l++; reve(l, r);}
        
if (!strcmp(str, "GET-SUM")) {scanf("%d%d"&l, &r); r += l++; printf("%d\n", get_sum(l, r));}
        
if (!strcmp(str, "MAX-SUM")) printf("%d\n", max_sum());
        ch 
= getchar();
    }
    fclose(stdin); fclose(stdout);
    
return 0;
}

最后把我的q个代码与BYVoid犇的本题代码进行测试比较,l果QBYVoid犇的代码见q里Q:

BYVoid犇的:


本沙茶的Q?br />

【相兌文?br />

Mato_No1 2011-06-21 16:06 发表评论
]]>
ơ小生成?/title><link>http://www.shnenglu.com/MatoNo1/archive/2011/05/29/147627.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 29 May 2011 08:03:00 GMT</pubDate><guid>http://www.shnenglu.com/MatoNo1/archive/2011/05/29/147627.html</guid><wfw:comment>http://www.shnenglu.com/MatoNo1/comments/147627.html</wfw:comment><comments>http://www.shnenglu.com/MatoNo1/archive/2011/05/29/147627.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/MatoNo1/comments/commentRss/147627.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/MatoNo1/services/trackbacks/147627.html</trackback:ping><description><![CDATA[<div>l出一个带Ҏ的无向图GQ设其最生成树为TQ求出图G的与T<span style="color: red"><strong>不完全相?/strong></span>的边权和最的生成树(即G的次生成树Q。一个无向图的两는成树不完全相同,当且仅当q两|中至有一条边不同。注意,图G可能不连通,可能有^行边Q但一定没有自环(其实对于自环也很好处理:直接舍弃。因为生成树中不可能出现自环Q?br />【具体题目?a title="URAL1416" >URAL1416</a>Q注意,q一题的ҎM的范围没有给出,视ؓ124750Q?br />【分析?br />定义生成树T的一个可行变?-E1, +E2)Q将T中的边E1删除后,再加入边E2Q满E2原来不在T中但在G中)Q若得到的仍然是图G的一는成树Q则该变换ؓ可行变换Q该可行变换?strong style="color: red">代h</strong>?E2权?- E1权?。这P很容易证明,G的次生成树是由G的最生成树l过一个代h的可行变换得到。进一步可以发玎ͼ<strong style="color: red">q个代h最的可行变换中加入的边E2的两端点如果为V1和V2Q那么E1一定是原来最生成树中从V1到V2的\径上的权值最大的?/strong>?br /><br />q样Q对于本题就有两U算法了Q(以下的T全部指G的最生成树Q?br />Q?QPrimQ?br />讄数组FQF[x][y]表示T中从x到y路径上的最大边的权倹{F数组可以在用Prim法求最生成树的过E中得出。每ơ将?i, j)加入后(j是新加入树的边,i=c[j]Q,枚D树中原有的每个点kQ包括iQ但不包括jQ,则F[k][j]=max{F[k][i], (i, j)Ҏ值}Q又׃F数组是对U的Q可以得到F[j][k]=F[k][j]。然后千万记住将图G中的?i, j)删除Q就是将L矩阵?i, j)Ҏ值改?#8734;Q!因ؓT中的Ҏ不能被加入的。等T被求出后Q所有的Fg求出了,然后Q枚丄i、jQ若L矩阵中边(i, j)权g是无I大Q这说明i、j间存在不在T中的边)Q则求出{(i, j)Ҏ?- F[i][j]}的|即ؓ加入?i, j)的代P求最的M价即可?br />另外注意三种Ҏ情况Q?】图G不连通,此时最生成树和次生成树均不存在。判定方法:在扩展T的过E中找不到新的可以加入的边;?】图G本n是一|Q此时最生成树存在Q就是G本nQ但ơ小生成树不存在。判定方法:在成功求出T后,发现L矩阵中的值全部是无穷大;?】图G存在q辏V这U情冉|ȝQ因时代h的可行变换(-E1, +E2)中,E1和E2可能是^行边Q因此,只有建立两个L矩阵Q分别存储每两点间权值最的边和权值次的边的权|然后Q每当一条新?i, j)加入Ӟ不是邻接矩阵中?i, j)权值改为无I大Q而是改ؓq接点i、j的权值次的边的权倹{?br /><br />代码Q? <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<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"><</span><span style="color: #000000">iostream</span><span style="color: #000000">></span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000"> </span><span style="color: #0000ff">namespace</span><span style="color: #000000"> std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000"> re(i, n) for (int i=0; i<n; i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000"> re2(i, l, r) for (int i=l; i<r; i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> MAXN </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">7000</span><span style="color: #000000">, INF </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000"> </span><span style="color: #000000">>></span><span style="color: #000000"> </span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000"> n, s[MAXN][MAXN], s2[MAXN][MAXN], f[MAXN][MAXN], c[MAXN], v[MAXN], res1 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">, res2 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000"> vst[MAXN];<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> init()<br />{<br />    freopen(</span><span style="color: #000000">"</span><span style="color: #000000">mst.in</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 />    scanf(</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">n);<br />    re(i, n) re(j, n) s[i][j] </span><span style="color: #000000">=</span><span style="color: #000000"> s2[i][j] </span><span style="color: #000000">=</span><span style="color: #000000"> INF;<br />    </span><span style="color: #0000ff">int</span><span style="color: #000000"> m, a, b, len;<br />    scanf(</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">m);<br />    </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">m) {<br />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (n </span><span style="color: #000000">></span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">) res1 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF; res2 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF;<br />        </span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />    }<br />    re(i, m) {<br />        scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">&</span><span style="color: #000000">a, </span><span style="color: #000000">&</span><span style="color: #000000">b, </span><span style="color: #000000">&</span><span style="color: #000000">len); a</span><span style="color: #000000">--</span><span style="color: #000000">; b</span><span style="color: #000000">--</span><span style="color: #000000">;<br />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (len </span><span style="color: #000000"><</span><span style="color: #000000"> s[a][b]) {s2[a][b] </span><span style="color: #000000">=</span><span style="color: #000000"> s2[b][a] </span><span style="color: #000000">=</span><span style="color: #000000"> s[a][b]; s[a][b] </span><span style="color: #000000">=</span><span style="color: #000000"> s[b][a] </span><span style="color: #000000">=</span><span style="color: #000000"> len;} </span><span style="color: #0000ff">else</span><span style="color: #000000"> </span><span style="color: #0000ff">if</span><span style="color: #000000"> (len </span><span style="color: #000000"><</span><span style="color: #000000"> s2[a][b]) s2[a][b] </span><span style="color: #000000">=</span><span style="color: #000000"> s2[b][a] </span><span style="color: #000000">=</span><span style="color: #000000"> len;<br />    }<br />    fclose(stdin);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> solve()<br />{<br />    re(i, n) {f[i][i] </span><span style="color: #000000">=</span><span style="color: #000000"> c[i] </span><span style="color: #000000">=</span><span style="color: #000000"> vst[i] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; v[i] </span><span style="color: #000000">=</span><span style="color: #000000"> s[</span><span style="color: #000000">0</span><span style="color: #000000">][i];} vst[</span><span style="color: #000000">0</span><span style="color: #000000">] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">;<br />    </span><span style="color: #0000ff">int</span><span style="color: #000000"> l0, l1 </span><span style="color: #000000">=</span><span style="color: #000000"> INF, x, y, z;<br />    re2(i, </span><span style="color: #000000">1</span><span style="color: #000000">, n) {<br />        l0 </span><span style="color: #000000">=</span><span style="color: #000000"> INF; re(j, n) </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">vst[j] </span><span style="color: #000000">&&</span><span style="color: #000000"> v[j] </span><span style="color: #000000"><</span><span style="color: #000000"> l0) {l0 </span><span style="color: #000000">=</span><span style="color: #000000"> v[j]; x </span><span style="color: #000000">=</span><span style="color: #000000"> j; y </span><span style="color: #000000">=</span><span style="color: #000000"> c[j];}<br />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (l0 </span><span style="color: #000000">==</span><span style="color: #000000"> INF) {res1 </span><span style="color: #000000">=</span><span style="color: #000000"> res2 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF; </span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />        vst[x] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">; res1 </span><span style="color: #000000">+=</span><span style="color: #000000"> l0; s[x][y] </span><span style="color: #000000">=</span><span style="color: #000000"> s[y][x] </span><span style="color: #000000">=</span><span style="color: #000000"> INF; </span><span style="color: #0000ff">if</span><span style="color: #000000"> (s2[x][y] </span><span style="color: #000000"><</span><span style="color: #000000"> INF </span><span style="color: #000000">&&</span><span style="color: #000000"> s2[x][y] </span><span style="color: #000000">-</span><span style="color: #000000"> l0 </span><span style="color: #000000"><</span><span style="color: #000000"> l1) l1 </span><span style="color: #000000">=</span><span style="color: #000000"> s2[x][y] </span><span style="color: #000000">-</span><span style="color: #000000"> l0;<br />        re(j, n) </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">vst[j] </span><span style="color: #000000">&&</span><span style="color: #000000"> s[x][j] </span><span style="color: #000000"><</span><span style="color: #000000"> v[j]) {v[j] </span><span style="color: #000000">=</span><span style="color: #000000"> s[x][j]; c[j] </span><span style="color: #000000">=</span><span style="color: #000000"> x;}<br />        re(j, n) </span><span style="color: #0000ff">if</span><span style="color: #000000"> (vst[j] </span><span style="color: #000000">&&</span><span style="color: #000000"> j </span><span style="color: #000000">!=</span><span style="color: #000000"> x) f[j][x] </span><span style="color: #000000">=</span><span style="color: #000000"> f[x][j] </span><span style="color: #000000">=</span><span style="color: #000000"> max(f[j][y], l0);<br />    }<br />    re(i, n</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">) re2(j, i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">, n) </span><span style="color: #0000ff">if</span><span style="color: #000000"> (s[i][j] </span><span style="color: #000000"><</span><span style="color: #000000"> INF) {<br />        z </span><span style="color: #000000">=</span><span style="color: #000000"> s[i][j] </span><span style="color: #000000">-</span><span style="color: #000000"> f[i][j];<br />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (z </span><span style="color: #000000"><</span><span style="color: #000000"> l1) l1 </span><span style="color: #000000">=</span><span style="color: #000000"> z;<br />    }<br />    </span><span style="color: #0000ff">if</span><span style="color: #000000"> (l1 </span><span style="color: #000000">==</span><span style="color: #000000"> INF) res2 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF; </span><span style="color: #0000ff">else</span><span style="color: #000000"> res2 </span><span style="color: #000000">=</span><span style="color: #000000"> res1 </span><span style="color: #000000">+</span><span style="color: #000000"> l1;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> pri()<br />{<br />    freopen(</span><span style="color: #000000">"</span><span style="color: #000000">mst.out</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">w</span><span style="color: #000000">"</span><span style="color: #000000">, stdout);<br />    printf(</span><span style="color: #000000">"</span><span style="color: #000000">Cost: %d\nCost: %d\n</span><span style="color: #000000">"</span><span style="color: #000000">, res1 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF </span><span style="color: #000000">?</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000"> : res1, res2 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF </span><span style="color: #000000">?</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000"> : res2);<br />    fclose(stdout);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000"> main()<br />{<br />    init();<br />    </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">res2) solve();<br />    pri();<br />    </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><span>效率分析QPrim法求次生成树</span><span>的时I复杂度均ؓO(N</span><sup>2</sup><span>)?/span><br /><br /><span>Q?QKruskalQ?/span><br /><span>Kruskal法也可以用来求ơ小生成树。在准备加入一条新?a, b)Q该边加入后不会出现环)Ӟ选择原来a所在连通块Q设为S1Q与b所在连通块Q设为S2Q?/span><span>中,</span><strong style="color: red">点的个数的那个</strong>Q如果随侉K一个,最坏情况下可能每次都碰到点数多的那个,旉复杂度可能增至O(NM)Q,扑ֈ该连通块中的每个点iQƈ遍历所有与i相关联的边,若发现某条边的另一端点j在未选择的那个连通块中(也就是该?i, j)跨越了S1和S2Q时Q就说明最l在T?删除?a, b)q加入该?一定是一个可行变换,且由于加Ҏ按照权值递增序的,(a, b)也一定是T中从i到j路径上权值最大的边,故这个可行变换可能成Zh的可行变换Q计其代h为[(i, j)Ҏ?- (a, b)Ҏ值]Q取最代价即可。注意,在遍历时需要排除一条边Q就?a, b)本nQ具体实现时׃用DL边表Q可以将?a, b)的编号代入)。另外还有一个难搞的地方Q如何快速找出某q通块内的所有点Q方法:׃使用q查集,q通块是用树的方式存储的,可以直接Z|Q准来说是一个森林)Q用“最左子l点+盔Rl点”表示Q则扑և树根后遍历这|p了,另外注意在合q连通块时也要同时合q树?br />对于三种Ҏ情况Q?】图G不连通。判定方法:遍历完所有的边后Q实际加入T的边数小?N-1)Q?】图G本n是一|。判定方法:找不到这L?i, j)Q?】图G存在q辏V这个对于Kruskal来说完全可以无视Q因为Kruskal中两条边只要~号不同pZ同的辏V?br />其实Kruskal法求次生成树q有一个优化:每次扑ֈ?i, j)后,一处理完这条边把它从图中删掉Q因为当S1和S2合ƈ后,(i, j)永q不可能再是可行变换中的E2了?br /><br />代码Q?br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<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"><</span><span style="color: #000000">iostream</span><span style="color: #000000">></span><span style="color: #000000"><br />#include </span><span style="color: #000000"><</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">></span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000"> </span><span style="color: #0000ff">namespace</span><span style="color: #000000"> std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000"> re(i, n) for (int i=0; i<n; i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000"> re3(i, l, r) for (int i=l; i<=r; i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> MAXN </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">7000</span><span style="color: #000000">, MAXM </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">130000</span><span style="color: #000000">, INF </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000"> </span><span style="color: #000000">>></span><span style="color: #000000"> </span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000"> edge {<br />    </span><span style="color: #0000ff">int</span><span style="color: #000000"> a, b, len, pre, next;<br />} ed[MAXM </span><span style="color: #000000">+</span><span style="color: #000000"> MAXM];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000"> edge2 {<br />    </span><span style="color: #0000ff">int</span><span style="color: #000000"> a, b, len, No;<br />} ed2[MAXM];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000"> n, m </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">, m2, u[MAXN], ch[MAXN], nx[MAXN], q[MAXN], res1 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">, res2 </span><span style="color: #000000">=</span><span style="color: #000000"> INF;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> init_d()<br />{<br />    re(i, n) ed[i].a </span><span style="color: #000000">=</span><span style="color: #000000"> ed[i].pre </span><span style="color: #000000">=</span><span style="color: #000000"> ed[i].next </span><span style="color: #000000">=</span><span style="color: #000000"> i;<br />    </span><span style="color: #0000ff">if</span><span style="color: #000000"> (n </span><span style="color: #000000">%</span><span style="color: #000000"> </span><span style="color: #000000">2</span><span style="color: #000000">) m </span><span style="color: #000000">=</span><span style="color: #000000"> n </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">; </span><span style="color: #0000ff">else</span><span style="color: #000000"> m </span><span style="color: #000000">=</span><span style="color: #000000"> n;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000"> a, </span><span style="color: #0000ff">int</span><span style="color: #000000"> b, </span><span style="color: #0000ff">int</span><span style="color: #000000"> l)<br />{<br />    ed[m].a </span><span style="color: #000000">=</span><span style="color: #000000"> a; ed[m].b </span><span style="color: #000000">=</span><span style="color: #000000"> b; ed[m].len </span><span style="color: #000000">=</span><span style="color: #000000"> l; ed[m].pre </span><span style="color: #000000">=</span><span style="color: #000000"> ed[a].pre; ed[m].next </span><span style="color: #000000">=</span><span style="color: #000000"> a; ed[a].pre </span><span style="color: #000000">=</span><span style="color: #000000"> m; ed[ed[m].pre].next </span><span style="color: #000000">=</span><span style="color: #000000"> m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />    ed[m].a </span><span style="color: #000000">=</span><span style="color: #000000"> b; ed[m].b </span><span style="color: #000000">=</span><span style="color: #000000"> a; ed[m].len </span><span style="color: #000000">=</span><span style="color: #000000"> l; ed[m].pre </span><span style="color: #000000">=</span><span style="color: #000000"> ed[b].pre; ed[m].next </span><span style="color: #000000">=</span><span style="color: #000000"> b; ed[b].pre </span><span style="color: #000000">=</span><span style="color: #000000"> m; ed[ed[m].pre].next </span><span style="color: #000000">=</span><span style="color: #000000"> m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> del_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000"> No)<br />{<br />    ed[ed[No].pre].next </span><span style="color: #000000">=</span><span style="color: #000000"> ed[No].next; ed[ed[No].next].pre </span><span style="color: #000000">=</span><span style="color: #000000"> ed[No].pre;<br />    ed[ed[No </span><span style="color: #000000">^</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">].pre].next </span><span style="color: #000000">=</span><span style="color: #000000"> ed[No </span><span style="color: #000000">^</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">].next; ed[ed[No </span><span style="color: #000000">^</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">].next].pre </span><span style="color: #000000">=</span><span style="color: #000000"> ed[No </span><span style="color: #000000">^</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">].pre;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> init()<br />{<br />    freopen(</span><span style="color: #000000">"</span><span style="color: #000000">mst.in</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 />    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">&</span><span style="color: #000000">n, </span><span style="color: #000000">&</span><span style="color: #000000">m2);<br />    </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">m2) {<br />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (n </span><span style="color: #000000">></span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">) res1 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF;<br />        res2 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF; </span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />    }<br />    init_d();<br />    </span><span style="color: #0000ff">int</span><span style="color: #000000"> a, b, len;<br />    re(i, m2) {<br />        scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">&</span><span style="color: #000000">a, </span><span style="color: #000000">&</span><span style="color: #000000">b, </span><span style="color: #000000">&</span><span style="color: #000000">len);<br />        ed2[i].No </span><span style="color: #000000">=</span><span style="color: #000000"> m; add_edge(</span><span style="color: #000000">--</span><span style="color: #000000">a, </span><span style="color: #000000">--</span><span style="color: #000000">b, len);<br />        ed2[i].a </span><span style="color: #000000">=</span><span style="color: #000000"> a; ed2[i].b </span><span style="color: #000000">=</span><span style="color: #000000"> b; ed2[i].len </span><span style="color: #000000">=</span><span style="color: #000000"> len;<br />    }<br />    fclose(stdin);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000"> cmp(</span><span style="color: #0000ff">const</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">s1, </span><span style="color: #0000ff">const</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">s2)<br />{<br />    </span><span style="color: #0000ff">return</span><span style="color: #000000"> ((edge2 </span><span style="color: #000000">*</span><span style="color: #000000">)s1)</span><span style="color: #000000">-></span><span style="color: #000000">len </span><span style="color: #000000">-</span><span style="color: #000000"> ((edge2 </span><span style="color: #000000">*</span><span style="color: #000000">)s2)</span><span style="color: #000000">-></span><span style="color: #000000">len;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> prepare()<br />{<br />    re(i, n) u[i] </span><span style="color: #000000">=</span><span style="color: #000000"> ch[i] </span><span style="color: #000000">=</span><span style="color: #000000"> nx[i] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />    qsort(ed2, m2, </span><span style="color: #000000">16</span><span style="color: #000000">, cmp);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000"> find(</span><span style="color: #0000ff">int</span><span style="color: #000000"> x)<br />{<br />    </span><span style="color: #0000ff">int</span><span style="color: #000000"> r </span><span style="color: #000000">=</span><span style="color: #000000"> x, r0 </span><span style="color: #000000">=</span><span style="color: #000000"> x, tmp;<br />    </span><span style="color: #0000ff">while</span><span style="color: #000000"> (u[r] </span><span style="color: #000000">>=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">) r </span><span style="color: #000000">=</span><span style="color: #000000"> u[r];<br />    </span><span style="color: #0000ff">while</span><span style="color: #000000"> (u[r0] </span><span style="color: #000000">>=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">) {tmp </span><span style="color: #000000">=</span><span style="color: #000000"> u[r0]; u[r0] </span><span style="color: #000000">=</span><span style="color: #000000"> r; r0 </span><span style="color: #000000">=</span><span style="color: #000000"> tmp;}<br />    </span><span style="color: #0000ff">return</span><span style="color: #000000"> r;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> uni(</span><span style="color: #0000ff">int</span><span style="color: #000000"> r1, </span><span style="color: #0000ff">int</span><span style="color: #000000"> r2, </span><span style="color: #0000ff">int</span><span style="color: #000000"> No, </span><span style="color: #0000ff">int</span><span style="color: #000000"> l0)<br />{<br />    q[</span><span style="color: #000000">0</span><span style="color: #000000">] </span><span style="color: #000000">=</span><span style="color: #000000"> r1;<br />    </span><span style="color: #0000ff">int</span><span style="color: #000000"> j, k, l1, front, rear;<br />    </span><span style="color: #0000ff">for</span><span style="color: #000000"> (front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">, rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">; front</span><span style="color: #000000"><=</span><span style="color: #000000">rear; front</span><span style="color: #000000">++</span><span style="color: #000000">) {<br />        j </span><span style="color: #000000">=</span><span style="color: #000000"> ch[q[front]];<br />        </span><span style="color: #0000ff">while</span><span style="color: #000000"> (j </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">) {<br />            q[</span><span style="color: #000000">++</span><span style="color: #000000">rear] </span><span style="color: #000000">=</span><span style="color: #000000"> j;<br />            j </span><span style="color: #000000">=</span><span style="color: #000000"> nx[j];<br />        }<br />    }<br />    re3(i, </span><span style="color: #000000">0</span><span style="color: #000000">, rear) {<br />        j </span><span style="color: #000000">=</span><span style="color: #000000"> q[i];<br />        </span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> p</span><span style="color: #000000">=</span><span style="color: #000000">ed[j].next; p </span><span style="color: #000000">!=</span><span style="color: #000000"> j; p</span><span style="color: #000000">=</span><span style="color: #000000">ed[p].next) {<br />            k </span><span style="color: #000000">=</span><span style="color: #000000"> ed[p].b;<br />            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (p </span><span style="color: #000000">!=</span><span style="color: #000000"> No </span><span style="color: #000000">&&</span><span style="color: #000000"> find(k) </span><span style="color: #000000">==</span><span style="color: #000000"> r2) {<br />                l1 </span><span style="color: #000000">=</span><span style="color: #000000"> ed[p].len </span><span style="color: #000000">-</span><span style="color: #000000"> l0;<br />                </span><span style="color: #0000ff">if</span><span style="color: #000000"> (l1 </span><span style="color: #000000"><</span><span style="color: #000000"> res2) res2 </span><span style="color: #000000">=</span><span style="color: #000000"> l1;<br />                del_edge(p);<br />            }<br />        }<br />    }<br />    u[r2] </span><span style="color: #000000">+=</span><span style="color: #000000"> u[r1]; u[r1] </span><span style="color: #000000">=</span><span style="color: #000000"> r2; nx[r1] </span><span style="color: #000000">=</span><span style="color: #000000"> ch[r2]; ch[r2] </span><span style="color: #000000">=</span><span style="color: #000000"> r1;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> solve()<br />{<br />    </span><span style="color: #0000ff">int</span><span style="color: #000000"> r1, r2, l0, num </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />    re(i, m2) {<br />        r1 </span><span style="color: #000000">=</span><span style="color: #000000"> find(ed2[i].a); r2 </span><span style="color: #000000">=</span><span style="color: #000000"> find(ed2[i].b);<br />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (r1 </span><span style="color: #000000">!=</span><span style="color: #000000"> r2) {<br />            l0 </span><span style="color: #000000">=</span><span style="color: #000000"> ed2[i].len; res1 </span><span style="color: #000000">+=</span><span style="color: #000000"> l0; num</span><span style="color: #000000">++</span><span style="color: #000000">;<br />            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (u[r1] </span><span style="color: #000000">>=</span><span style="color: #000000"> u[r2]) uni(r1, r2, ed2[i].No, l0); </span><span style="color: #0000ff">else</span><span style="color: #000000"> uni(r2, r1, ed2[i].No </span><span style="color: #000000">^</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">, l0);<br />        }<br />    }<br />    </span><span style="color: #0000ff">if</span><span style="color: #000000"> (num </span><span style="color: #000000"><</span><span style="color: #000000"> n </span><span style="color: #000000">-</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">) {res1 </span><span style="color: #000000">=</span><span style="color: #000000"> res2 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF; </span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />    </span><span style="color: #0000ff">if</span><span style="color: #000000"> (res2 </span><span style="color: #000000">==</span><span style="color: #000000"> INF) res2 </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF; </span><span style="color: #0000ff">else</span><span style="color: #000000"> res2 </span><span style="color: #000000">+=</span><span style="color: #000000"> res1;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000"> pri()<br />{<br />    freopen(</span><span style="color: #000000">"</span><span style="color: #000000">mst.out</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">w</span><span style="color: #000000">"</span><span style="color: #000000">, stdout);<br />    printf(</span><span style="color: #000000">"</span><span style="color: #000000">Cost: %d\nCost: %d\n</span><span style="color: #000000">"</span><span style="color: #000000">, res1 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF </span><span style="color: #000000">?</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000"> : res1, res2 </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">INF </span><span style="color: #000000">?</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000"> : res2);<br />    fclose(stdout);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000"> main()<br />{<br />    init();<br />    </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">res1 </span><span style="color: #000000">&&</span><span style="color: #000000"> res2 </span><span style="color: #000000">==</span><span style="color: #000000"> INF) {<br />        prepare();<br />        solve();<br />    }<br />    pri();<br />    </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div>效率分析Q可以证明,如果每次都选取点少的连通块QKruskal法求次生成树的时间复杂度为O(M*(logN+logM))Q空间复杂度为O(M)?br />ȝQ显然Prim适用于稠密图Q而Kruskal适用于稀疏图?br /><br />下面是对于一些数据的试l果Q数据说明:W?~9个点和第15个点为稠密图或一般图Q第10~14个点为稀疏图Q?br /><br />PrimQ?br /><img height="194" alt="" src="http://www.shnenglu.com/images/cppblog_com/matono1/评l果/ơ小生成树_Prim.jpg" width="333" border="0" /><br /><br />KruskalQ加入删边优化)Q?br /><img height="195" alt="" src="http://www.shnenglu.com/images/cppblog_com/matono1/评l果/ơ小生成树_Kruskal1.jpg" width="340" border="0" /><br /><br />KruskalQ未加删边优化)Q?br /><img height="195" alt="" src="http://www.shnenglu.com/images/cppblog_com/matono1/评l果/ơ小生成树_Kruskal2.jpg" width="340" border="0" /><br /></div><img src ="http://www.shnenglu.com/MatoNo1/aggbug/147627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-05-29 16:03 <a href="http://www.shnenglu.com/MatoNo1/archive/2011/05/29/147627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>profit是怎样被SAP的多路增q虐爆的…?/title><link>http://www.shnenglu.com/MatoNo1/archive/2011/03/19/142225.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 19 Mar 2011 09:55:00 GMT</pubDate><guid>http://www.shnenglu.com/MatoNo1/archive/2011/03/19/142225.html</guid><wfw:comment>http://www.shnenglu.com/MatoNo1/comments/142225.html</wfw:comment><comments>http://www.shnenglu.com/MatoNo1/archive/2011/03/19/142225.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.shnenglu.com/MatoNo1/comments/commentRss/142225.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/MatoNo1/services/trackbacks/142225.html</trackback:ping><description><![CDATA[<p>代码1QSAP单\增广Q非递归Q;</p> <p>代码2QSAP多\增广Q递归Q;</p> <p>代码3QDinic单\增广Q非递归Q;</p> <p>代码4QDinic多\增广Q递归Q;</p> <p>l果Q?/p> <p>代码1Q?br><img height=146 alt="" src="http://www.shnenglu.com/images/cppblog_com/matono1/评l果/SAP1.jpg" width=331 border=0></p> 代码2Q?<br><img height=147 alt="" src="http://www.shnenglu.com/images/cppblog_com/matono1/评l果/SAP2.jpg" width=336 border=0><br>代码3Q?br><img height=145 alt="" src="http://www.shnenglu.com/images/cppblog_com/matono1/评l果/Dinic1.jpg" width=337 border=0><br> 代码4Q?br><img height=147 alt="" src="http://www.shnenglu.com/images/cppblog_com/matono1/评l果/Dinic2.jpg" width=337 border=0><br>l果Q?br>SAP加了多\增广后,直接U掉?个点Q?br>Dinic加了多\增广后效率差不多Q还更低了一?#8230;…<br><br>Q另外发玎ͼSAP的多路增q不支持当前弧优?#8230;…q点和zkw费用有点像?#8230;…不过效率影响不大……Q?br> <img src ="http://www.shnenglu.com/MatoNo1/aggbug/142225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-03-19 17:55 <a href="http://www.shnenglu.com/MatoNo1/archive/2011/03/19/142225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.cxwlvip.cn" target="_blank">þav</a>| <a href="http://www.xinanyue.cn" target="_blank">69Ʒþþþ9999APGF</a>| <a href="http://www.djlf.net.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.yffd.com.cn" target="_blank">þþþAVվ</a>| <a href="http://www.pn00.com.cn" target="_blank">þþþþþ91Ʒѹۿ</a>| <a href="http://www.123oye.cn" target="_blank">ɫþþۺ</a>| <a href="http://www.lshwn.cn" target="_blank">99ƷȾþ</a>| <a href="http://www.dw172.cn" target="_blank">һŷƬþ</a>| <a href="http://www.djdnx.cn" target="_blank">ҹþþþþþþõӰ</a>| <a href="http://www.jkh7.cn" target="_blank">þþƷѹۿ</a>| <a href="http://www.kuruishanghai.cn" target="_blank">þþۺϾɫۺ̾</a>| <a href="http://www.0731z.cn " target="_blank">þԭƷ</a>| <a href="http://www.zqdy.com.cn" target="_blank">þþþֻоƷ</a>| <a href="http://www.ip-domain.com.cn" target="_blank">þþþAVۺ</a>| <a href="http://www.panroad.cn" target="_blank">þٸ۲AV</a>| <a href="http://www.2345i.cn" target="_blank">Ʒþþþþר</a>| <a href="http://www.vip910.cn" target="_blank">ɫͷվþ</a>| <a href="http://www.jl893.com.cn" target="_blank">պþþþƷӰԺҳ</a>| <a href="http://www.ailazi.com.cn" target="_blank">޾Ʒþþþþþþþþþ</a>| <a href="http://www.arouk.cn" target="_blank">99þۺϹƷ</a>| <a href="http://www.fcaiwanzhen.cn" target="_blank">þþþavרˮ </a>| <a href="http://www.hnyongsheng.cn" target="_blank">þ޾Ʒavվ</a>| <a href="http://www.111party.cn" target="_blank">Ʒѿþþ㽶</a>| <a href="http://www.bveuge.cn" target="_blank">þþþþAv뾫Ʒר </a>| <a href="http://www.tjonline.com.cn" target="_blank">ۺϾþĻӰ</a>| <a href="http://www.kukuoo.cn" target="_blank">þþƷƷapp</a>| <a href="http://www.steelcom.cn" target="_blank">һɫþۺ޾Ʒ</a>| <a href="http://www.transeurope.com.cn" target="_blank">ھƷþþþþþcoent</a>| <a href="http://www.huiju58.cn" target="_blank">˾ƷþѶ</a>| <a href="http://www.corporateavenue.cn" target="_blank">Ļþи </a>| <a href="http://www.k1877.cn" target="_blank">ϵרþ</a>| <a href="http://www.0736auto.cn" target="_blank">þùƷ99þþþþ</a>| <a href="http://www.jkwovf.cn" target="_blank">þþƷAVһ </a>| <a href="http://www.a3314.cn" target="_blank">þþûƬ</a>| <a href="http://www.bxdlcd.cn" target="_blank">þþƷƷ</a>| <a href="http://www.rigemei.cn" target="_blank">Ʒ999þþþþĻ</a>| <a href="http://www.zambak.cn" target="_blank">ˬݾþþۺ鶹</a>| <a href="http://www.bwgwdl.cn" target="_blank">þþƷ99Ʒ </a>| <a href="http://www.ganzhoupei.cn" target="_blank">þùƷһ</a>| <a href="http://www.yd-job.cn" target="_blank">ŷþþþþ</a>| <a href="http://www.szjjls.cn" target="_blank">yy6080þ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>