码迷,mamicode.com
首页 > 其他好文 > 详细

model

时间:2016-05-26 18:53:28      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

   1 /**************************************************
   2 
   3             模版:01背包
   4             题目:HDU2602 Bone Collector
   5 
   6 **************************************************/
   7 
   8 #include<iostream>
   9 #include<cstring>
  10 #include<cstdio>
  11 using namespace std;
  12 const int maxn=1000+10;
  13 #define Max(a, b) ((a)>(b)?(a):(b))
  14 
  15 int T, n, m, p[maxn], v[maxn], f[maxn];
  16 
  17 int main()
  18 {
  19     scanf("%d", &T);
  20     while(T--)
  21     {
  22         memset(f, 0, sizeof f);
  23 
  24         scanf("%d%d", &n, &m);
  25         for(int i=1; i<=n; i++) scanf("%d", &p[i]);
  26         for(int i=1; i<=n; i++) scanf("%d", &v[i]);
  27         
  28         for(int i=1; i<=n; i++)
  29             for(int j=m; j>=v[i]; j--)
  30                 f[j]=Max(f[j], f[j-v[i]]+p[i]);
  31         printf("%d\n", f[m]);
  32     }
  33     return 0;
  34 }
  35 
  36 
  37 
  38 
  39 /**************************************************
  40 
  41             模版:并查集
  42             题目:POJ1182 食物链
  43 
  44 **************************************************/
  45 
  46 #include<iostream>
  47 #include<cstring>
  48 #include<cstdio>
  49 using namespace std;
  50 const int maxn=50000+10;
  51 
  52 int n, m, a[5], b[5], f[maxn*3], p[maxn*3];
  53 
  54 void Pre()
  55 {
  56     for(int i=1; i<=n; i++) p[i]=i, p[i+n]=i+n, p[i+n*2]=i+n*2;
  57     for(int i=1; i<=n; i++) f[i]=i+n, f[i+n]=i+n*2, f[i+n*2]=i;
  58     return ;
  59 }
  60 
  61 int Root(int x)
  62 {
  63     return (x==p[x])?(x):(p[x]=Root(p[x]));
  64 }
  65 
  66 int main()
  67 {
  68     scanf("%d%d", &n, &m);
  69     Pre();
  70 
  71     int d, x, y, ans=0;
  72 
  73     for(int i=1; i<=m; i++)
  74     {
  75         scanf("%d%d%d", &d, &x, &y);
  76 
  77         if(x>n||y>n||(d==2&&x==y))  
  78         {
  79             ++ans;
  80             continue;
  81         }
  82             
  83         a[0]=Root(x), a[1]=f[a[0]], a[2]=f[a[1]];
  84         b[0]=Root(y), b[1]=f[b[0]], b[2]=f[b[1]];
  85             
  86         bool flag=false;
  87         for(int j=0; j<3&&!flag; j++)  if(a[0]==b[j])  flag=true;
  88 
  89         if(d==1)
  90         {
  91             if(flag)    ans+=(a[0]!=b[0]);
  92             else for(int j=0; j<3; j++) p[b[j]]=a[j];
  93         }
  94         else
  95         {
  96             if(flag)    ans+=(a[0]!=b[1]);
  97             else for(int j=0; j<3; j++) p[b[j]]=a[(j+2)%3];
  98         }
  99             
 100     }
 101 
 102     printf("%d\n", ans);
 103     return 0;
 104 }
 105 
 106 
 107 
 108 
 109 /**************************************************
 110 
 111             模版:二分图最大匹配
 112             题目:POJ1274 The Perfect Stall
 113             
 114 **************************************************/
 115 
 116 #include<iostream>
 117 #include<cstring>
 118 #include<cstdio>
 119 using namespace std;
 120 const int maxn=200+10;
 121 
 122 int n, m, ans, from[maxn];
 123 int cur, fir[maxn], ver[maxn*maxn], nxt[maxn*maxn];
 124 bool vis[maxn];
 125 
 126 void Add(int u, int v)
 127 {
 128     ver[++cur]=v, nxt[cur]=fir[u], fir[u]=cur;
 129     return ;
 130 }
 131 
 132 bool Dfs(int u)
 133 {
 134     for(int i=fir[u], v; i; i=nxt[i])
 135     {
 136         if(vis[v=ver[i]])   continue;
 137         vis[v]=true;
 138         
 139         if((!from[v=ver[i]])||Dfs(from[v]))
 140         {
 141             from[v]=u;
 142             return true;
 143         }
 144     }
 145     return false;
 146 }
 147 
 148 int main()
 149 {
 150     while(scanf("%d%d", &n, &m)!=EOF)
 151     {
 152         cur=0, ans=0;
 153         memset(fir, 0, sizeof fir);
 154         memset(from, 0, sizeof from);
 155 
 156         for(int u=1, v, k; u<=n; u++)
 157         {
 158             scanf("%d", &k);
 159             for(int i=1; i<=k; i++)
 160             {
 161                 scanf("%d", &v);
 162                 Add(u, v);
 163             }
 164         }
 165 
 166         for(int i=1; i<=n; i++)
 167         {
 168             memset(vis, 0, sizeof vis);
 169             ans+=Dfs(i);
 170         }
 171 
 172         cout<<ans<<endl;
 173     }
 174     return 0;
 175 }
 176 
 177 
 178 
 179 
 180 /**************************************************
 181 
 182             模版:二分图最佳匹配
 183             题目:POJ2195 Going Home
 184             
 185 **************************************************/
 186 
 187 #include<iostream>
 188 #include<cstring>
 189 #include<cstdio>
 190 #define Min(a, b) ((a)<(b)?(a):(b))
 191 #define Abs(a) ((a)>0?(a):-(a))
 192 using namespace std;
 193 const int maxn=100+10;
 194 const int INF=0x7f7f7f7f;
 195 
 196 int n, m, ch, cm;
 197 int lx[maxn*maxn], ly[maxn], w[maxn*maxn][maxn], from[maxn], del;
 198 bool vx[maxn*maxn], vy[maxn];
 199 struct node
 200 {
 201     int x, y;
 202     node(int a=0, int b=0){ x=a, y=b; }
 203 }ph[maxn], pm[maxn*maxn];
 204 
 205 int Dis(int a, int b)
 206 {
 207     return Abs(pm[a].x-ph[b].x)+Abs(pm[a].y-ph[b].y);
 208 }
 209 
 210 bool Dfs(int x)
 211 {
 212     vx[x]=true;
 213     for(int y=1; y<=ch; y++)
 214     {
 215         if(vy[y])   continue;
 216 
 217         int t=lx[x]+ly[y]-w[x][y];
 218         if(!t)
 219         {
 220             vy[y]=true;
 221             if((!from[y])||Dfs(from[y]))
 222             {
 223                 from[y]=x;
 224                 return true;
 225             }
 226         }
 227         else if(del>t)  del=t;
 228     }
 229     return false;
 230 }
 231 
 232 int KM()
 233 {
 234     for(int i=1; i<=cm; i++)
 235     {
 236         while(true)
 237         {
 238             memset(vx, 0, sizeof vx);
 239             memset(vy, 0, sizeof vy);
 240             del=INF;
 241             if(Dfs(i))  break;
 242             for(int j=1; j<=cm; j++)  if(vx[j])   lx[j]-=del;
 243             for(int j=1; j<=ch; j++)  if(vy[j])   ly[j]+=del;
 244         }
 245     }
 246 
 247     int ans=0;
 248     for(int i=1; i<=ch; i++)    if(from[i])    ans+=w[from[i]][i];
 249     return ans;
 250 }
 251 
 252 int main()
 253 {
 254     int T=0;
 255     while(scanf("%d%d", &n, &m)!=EOF&&n+m)
 256     {
 257         ch=cm=0;
 258         memset(ly, 0, sizeof ly);
 259         memset(from, 0, sizeof from);
 260         char s[maxn];
 261 
 262         for(int i=1; i<=n; i++)
 263         {
 264             scanf("%s", s+1);
 265             for(int j=1; j<=m; j++)
 266             {
 267                 if(s[j]==H)   ph[++ch]=node(i, j);
 268                 else if(s[j]==m)  pm[++cm]=node(i, j);
 269             }
 270         }
 271 
 272         for(int i=1; i<=cm; i++)
 273         {
 274             lx[i]=-INF;
 275             for(int j=1; j<=ch; j++)
 276             {
 277                 w[i][j]=-Dis(i, j);
 278                 lx[i]=Min(lx[i], w[i][j]);
 279             }
 280         }
 281         
 282         cout<<-KM()<<endl;
 283     }
 284     return 0;
 285 }
 286 
 287 
 288 
 289 
 290 /**************************************************
 291 
 292             模版:二维树状数组
 293             题目:CQBZ1909 二维区间的和
 294 
 295 **************************************************/
 296 
 297 #include<iostream>
 298 #include<cstdio>
 299 #include<cstring>
 300 #define lowbit(i) ((i)&(-i))
 301 using namespace std;
 302 const int maxn=1500+10;
 303  
 304 int n,a[maxn][maxn];
 305  
 306 void get_int(int &num)
 307 {
 308     char c; bool f=false;
 309     for(; c=getchar(),c<0||c>9; (c==-)&&(f=true));
 310     for(num=c-48; c=getchar(),c>=0&&c<=9; num=num*10+c-48);
 311     f&&(num=-num);
 312     return ;
 313 }
 314  
 315 void Add(int x, int y, int t)
 316 {
 317     for(int i=x+1; i<=n; i+=lowbit(i))
 318         for(int j=y+1; j<=n; j+=lowbit(j))
 319             a[i][j]+=t;
 320     return ;
 321 }
 322  
 323 int Sum(int x,int y)
 324 {
 325     int ans=0;
 326     for(int i=x+1; i; i-=lowbit(i))
 327         for(int j=y+1; j; j-=lowbit(j))
 328             ans+=a[i][j];
 329     return ans;
 330 }
 331  
 332 int main()
 333 {
 334     int d, x1, y1, t, x2, y2;
 335  
 336     scanf("%d%d", &d, &n);
 337     while(scanf("%d",&d)&&d!=3)
 338     {
 339         if(d==1)
 340         {
 341             get_int(x1), get_int(y1), get_int(t);
 342             Add(x1,y1,t);
 343         }
 344         else
 345         {
 346             get_int(x1), get_int(y1), get_int(x2), get_int(y2);
 347             printf("%d\n", Sum(x2,y2)+ Sum(x1-1,y1-1)- Sum(x1-1,y2)- Sum(x2,y1-1));
 348         }
 349     }
 350     return 0;
 351 }
 352 
 353 
 354 
 355 
 356 /**************************************************
 357 
 358             模版:高精度
 359             题目:高精度加减乘除
 360 
 361 **************************************************/
 362 
 363 #include<iostream>
 364 #include<fstream>
 365 #include<cstring>
 366 #include<cstdio>
 367 using namespace std;
 368 typedef long long lint;
 369 const int MAXN=5010;
 370 struct node
 371 {
 372     long long n[MAXN],lim;
 373     node(){ memset(n,0,sizeof(n));n[0]=1LL;lim=10000LL; }
 374     bool operator <(node a) const
 375     {
 376         if(n[0]!=a.n[0])    return n[0]<a.n[0];
 377         for(int i=n[0];i>=1;i--)
 378             if(n[i]!=a.n[i])    return n[i]<a.n[i];
 379         return false;
 380     }
 381     bool operator >(node a) const
 382     {
 383         if(n[0]!=a.n[0])    return n[0]>a.n[0];
 384         for(int i=n[0];i>=1;i--)
 385             if(n[i]!=a.n[i])    return n[i]>a.n[i];
 386         return false;
 387     }
 388     bool operator ==(node a) const
 389     {
 390         if(n[0]!=a.n[0])    return false;
 391         for(int i=1;i<=n[0];i++)
 392             if(n[i]!=a.n[i])    return false;
 393         return true;
 394     }
 395     void operator +=(lint a)
 396     {
 397         n[1]+=a;
 398         for(int i=1;i<=n[0];i++)
 399         {
 400             n[i+1]+=(n[i]/lim);
 401             n[i]%=lim;
 402             if(i==n[0]&&n[i+1])  ++n[0];
 403         }
 404     }
 405     node operator +(lint a)
 406     {
 407         node t=*this;
 408         t+=a;
 409         return t;
 410     }
 411     void operator +=(node a)
 412     {
 413         n[0]=max(n[0],a.n[0]);
 414         for(int i=1;i<=n[0];i++)    n[i]+=a.n[i];
 415         for(int i=1;i<=n[0];i++)
 416         {
 417             n[i+1]+=(n[i]/lim);
 418             n[i]%=lim;
 419             if(i==n[0]&&n[i+1]) ++n[0];
 420         }
 421     }
 422     node operator +(node a)
 423     {
 424         node t=*this;
 425         t+=a;
 426         return t;
 427     }
 428     void operator -=(lint a)
 429     {
 430         n[1]-=a;
 431         for(int i=1;n[i]<0&&i<n[0];i++)
 432             while(n[i]<0)   n[i]+=lim,n[i+1]-=1;
 433         for(;!n[n[0]]&&n[0]>1;--n[0]);
 434     }
 435     node operator -(lint a)
 436     {
 437         node t=*this;
 438         t-=a;
 439         return t;
 440     }
 441     void operator -=(node a)
 442     {
 443         for(int i=1;i<=n[0];i++)
 444         {
 445             if(n[i]<a.n[i]) n[i]+=lim,n[i+1]-=1;
 446             n[i]-=a.n[i];
 447         }
 448         for(;!n[n[0]]&&n[0]>1;--n[0]);
 449     }
 450     node operator -(node a)
 451     {
 452         node t=*this;
 453         t-=a;
 454         return t;
 455     }
 456     void operator *=(lint a)
 457     {
 458         for(int i=1;i<=n[0];i++)    n[i]*=a;
 459         for(int i=1;i<=n[0];i++)
 460         {
 461             n[i+1]+=(n[i]/lim);
 462             n[i]%=lim;
 463             if(i==n[0]&&n[i+1]) ++n[0];
 464         }
 465     }
 466     node operator *(lint a)
 467     {
 468         node t=*this;
 469         t*=a;
 470         return t;
 471     }
 472     void operator *=(node a)
 473     {
 474         node c;
 475         c.n[0]=n[0]+a.n[0]-1;
 476         for(int i=1;i<=n[0];i++)
 477             for(int j=1;j<=a.n[0];j++)
 478                 c.n[i+j-1]+=n[i]*a.n[j];
 479         for(int i=1;i<=c.n[0];i++)
 480         {
 481             c.n[i+1]+=(c.n[i]/lim);
 482             c.n[i]%=lim;
 483             if(i==c.n[0]&&c.n[i+1]) ++c.n[0];
 484         }
 485         *this=c;
 486     }
 487     node operator *(node a)
 488     {
 489         node t=*this;
 490         t*=a;
 491         return t;
 492     }
 493     void operator /=(lint a)
 494     {
 495         for(int i=n[0];i>1;i--)
 496         {
 497             n[i-1]+=(n[i]%a*lim);
 498             n[i]/=a;
 499         }
 500         for(n[1]/=a;n[0]>1&&!n[n[0]];--n[0]);
 501     }
 502     node operator /(lint a)
 503     {
 504         node t=*this;
 505         t/=a;
 506         return t;
 507     }
 508     void operator /=(node a)
 509     {
 510         node L,M,R=*this;
 511         while(L<R)
 512         {
 513             M=(L+R+1)/2;
 514             if((a*M)>*this) R=M-1;
 515             else L=M;
 516         }
 517         *this=L;
 518     }
 519     node operator /(node a)
 520     {
 521         node t=*this;
 522         t/=a;
 523         return t;
 524     }
 525     void read()
 526     {
 527         string s;
 528         cin>>s;
 529         n[0]=s.size();
 530         for(int i=0,j;j=(n[0]-i-1)/4+1,i<n[0];i++)  n[j]=n[j]*10+s[i]-0;
 531         if(n[0]%4)  n[0]=n[0]/4+1;
 532         else n[0]/=4;
 533     }
 534     void put()
 535     {
 536         int i=n[0];
 537         cout<<n[i];
 538         for(--i;i;--i)  printf("%04lld",n[i]);
 539         cout<<endl;
 540     }
 541 }a,b,c;
 542 node Gcd(node a,node b)
 543 {
 544     if(a.n[0]==1&&a.n[1]==0)  return b;
 545     if(b.n[0]==1&&b.n[1]==0)  return a;
 546     if((a.n[1]&1)&&(b.n[1]&1))  return ((a>b)?(Gcd(a-b,b)):(b-a,a));
 547     if(a.n[1]&1)  return Gcd(a,b/2);
 548     if(b.n[1]&1)  return Gcd(a/2,b);
 549     return Gcd(a/2,b/2)*2;
 550 }
 551 int main()
 552 {
 553     //
 554     /*
 555     a.read();
 556     b.read();
 557     a+=b;
 558     a.put();
 559     */
 560  
 561     //
 562     /*
 563     a.read();
 564     b.read();
 565     if(a<b) { cout<<‘-‘; c=b-a;}
 566     else c=a-b;
 567     c.put();
 568     */
 569  
 570     //
 571     /*
 572     a.read();
 573     b.read();
 574     a*=b;
 575     a.put();
 576     */
 577  
 578     //
 579      
 580     a.read();
 581     b.read();
 582     c=a;
 583     a/=b;
 584     a.put();
 585     a*=b;
 586     c-=a;
 587     c.put();
 588      
 589     return 0;
 590 }
 591 
 592 
 593 
 594 
 595 /**************************************************
 596 
 597             模版:Manacher
 598             题目:POJ3974 Palindrome
 599             
 600 **************************************************/
 601 
 602 #include<iostream>
 603 #include<cstring>
 604 #include<cstdio>
 605 using namespace std;
 606 const int maxn=1000000*2+10;
 607 #define Max(a, b) ((a)>(b)?(a):(b))
 608 #define Min(a, b) ((a)<(b)?(a):(b))
 609 
 610 int main()
 611 {
 612     int T=0;
 613     string t;
 614     while(cin>>t)
 615     {
 616         if(t[0]==E)   break;
 617 
 618         string s="!*";
 619         for(int i=0, j=t.size(); i<j; i++)  s+=t[i], s+=*;
 620         
 621         int f[maxn]={0}, n=s.size();
 622         int id=0, mx=0, ans=0;
 623         for(int i=1; i<n; i++)
 624         {
 625             f[i]= (mx>i)? Min(f[id*2-i], mx-i): 1;
 626             while(s[i-f[i]]==s[i+f[i]])  ++f[i];
 627             ans=Max(ans, f[i]);
 628             if(i+f[i]>mx)   mx=i+f[i], id=i;
 629         }
 630 
 631         printf("Case %d: %d\n", ++T, ans-1);
 632     }
 633     return 0;
 634 }
 635 
 636 
 637 
 638 
 639 /**************************************************
 640 
 641             模版:欧拉路径
 642             题目:HDU1116 play on words
 643 
 644 **************************************************/
 645 
 646 #include<iostream>
 647 #include<cstring>
 648 #include<cstdio>
 649 using namespace std;
 650 const int maxn=26+5;
 651 
 652 int T, n, fa[maxn], in[maxn], out[maxn];
 653 
 654 int Rt(int x)
 655 {
 656     return (x==fa[x])?(x):(fa[x]=Rt(fa[x]));
 657 }
 658 
 659 void Init()
 660 {
 661     memset(in, 0, sizeof in);
 662     memset(out, 0, sizeof out);
 663     for(int i=0; i<26; i++) fa[i]=i;
 664     return ;
 665 }
 666 
 667 bool Read()
 668 {
 669     scanf("%d", &n);
 670     
 671     string s;
 672     int a, b;
 673     for(int i=1; i<=n; i++)
 674     {
 675         cin>>s;
 676         a=s[0]-a, b=s[s.size()-1]-a;
 677         ++in[a], ++out[b];
 678         fa[Rt(b)]=Rt(a);
 679     }
 680     
 681     a=Rt(a);
 682     for(int i=0; i<26; i++)
 683         if((in[i]||out[i])&&Rt(i)!=a)
 684             return false;
 685     return true;
 686 }
 687 
 688 bool Work()
 689 {
 690     int _in=0, _out=0;
 691     for(int i=0; i<26; i++)
 692     {
 693         if(in[i]==out[i])   continue;
 694         else if(in[i]==out[i]+1) ++_in;
 695         else if(in[i]+1==out[i]) ++_out;
 696         else return false;
 697     }
 698     return (_in==_out)&&(_in<2);
 699 }
 700 
 701 int main()
 702 {
 703     scanf("%d", &T);
 704     while(T--)
 705     {
 706         Init();
 707         if(Read()&&Work())  printf("Ordering is possible.\n");
 708         else printf("The door cannot be opened.\n");
 709     }
 710     return 0;
 711 }
 712 
 713 
 714 
 715 
 716 /**************************************************
 717 
 718             模版:欧拉路径输出
 719             题目:POJ2337 catenyms
 720 
 721 **************************************************/
 722 
 723 #include<iostream>
 724 #include<algorithm>
 725 #include<cstring>
 726 #include<cstdio>
 727 using namespace std;
 728 const int maxn=1000+10, maxm=26+5;
 729 #define Min(a, b) ((a)<(b)?(a):(b))
 730 
 731 int T, n, in[maxm], out[maxm], fa[maxm], root, put[maxn];
 732 string s[maxn];
 733 bool vis[maxn];
 734 
 735 int Rt(int x)
 736 {
 737     return (x==fa[x])?(x):(fa[x]=Rt(fa[x]));
 738 }
 739 
 740 void Init()
 741 {
 742     root=maxm;
 743     memset(in, 0, sizeof in);
 744     memset(out, 0, sizeof out);
 745     memset(vis, false, sizeof vis);
 746     for(int i=0; i<26; i++) fa[i]=i;
 747     return ;
 748 }
 749 
 750 bool Read()
 751 {
 752     scanf("%d", &n);
 753 
 754     int a, b;
 755     for(int i=1; i<=n; i++)
 756     {
 757         cin>>s[i];
 758         a=s[i][0]-a, b=s[i][s[i].size()-1]-a;
 759         ++in[a], ++out[b];
 760         root=Min(root, a);
 761         fa[Rt(b)]=Rt(a);
 762     }
 763 
 764     a=Rt(a);
 765     for(int i=0; i<26; i++)
 766         if((in[i]||out[i])&&Rt(i)!=a)
 767             return false;
 768     return true;
 769 }
 770 
 771 bool Work()
 772 {
 773     int _in=0, _out=0;
 774     for(int i=0; i<26; i++)
 775     {
 776         if(in[i]==out[i])   continue;
 777         else if(in[i]==out[i]+1) ++_in, root=i;
 778         else if(in[i]+1==out[i]) ++_out;
 779         else return false;
 780     }
 781     return (_in==_out)&&(_in<2);
 782 }
 783 
 784 bool Dfs(int x, int cnt)
 785 {
 786     for(int i=1; i<=n; i++)
 787         if((!vis[i])&&s[i][0]-a==x)
 788         {
 789             vis[i]=true;
 790             put[cnt]=i;
 791             if(cnt==n||Dfs(s[i][s[i].size()-1]-a, cnt+1)) return true;
 792             vis[i]=false;
 793         }
 794     return false;
 795 }
 796 
 797 int main()
 798 {
 799     scanf("%d", &T);
 800     while(T--)
 801     {
 802         Init();
 803         if(Read()&&Work())
 804         {
 805             sort(s+1, s+1+n);
 806             Dfs(root, 1);
 807             for(int i=1; i<n; i++)  cout<<s[put[i]]<<.;
 808             cout<<s[put[n]]<<endl;
 809         }
 810         else printf("***\n");
 811     }
 812     return 0;
 813 }
 814 
 815 
 816 
 817 
 818 /**************************************************
 819 
 820             模版:Avl
 821             题目:POJ3481 Double Queue
 822 
 823 **************************************************/
 824 
 825 #include<iostream>
 826 #include<cstring>
 827 #include<cstdio>
 828 using namespace std;
 829 const int maxn=(1e6)+10;
 830 #define Max(a, b) ((a)>(b)?(a):(b))
 831 
 832 int root, cnt;
 833 
 834 struct node
 835 {
 836     int val, idx, lc, rc, h;
 837     node() { val=idx=lc=rc=h=0; }
 838 }tr[maxn];
 839 
 840 void Zig(int &rt)
 841 {
 842     int tp=tr[rt].lc;
 843     tr[rt].lc=tr[tp].rc;
 844     tr[tp].rc=rt;
 845     tr[rt].h=Max(tr[tr[rt].lc].h, tr[tr[rt].rc].h)+1;
 846     tr[tp].h=Max(tr[tr[tp].lc].h, tr[tr[tp].rc].h)+1;
 847     rt=tp;
 848     return ;
 849 }
 850 
 851 void Zag(int &rt)
 852 {
 853     int tp=tr[rt].rc;
 854     tr[rt].rc=tr[tp].lc;
 855     tr[tp].lc=rt;
 856     tr[rt].h=Max(tr[tr[rt].lc].h, tr[tr[rt].rc].h)+1;
 857     tr[tp].h=Max(tr[tr[tp].lc].h, tr[tr[tp].rc].h)+1;
 858     rt=tp;
 859     return ;
 860 }
 861 
 862 void Zagzig(int &rt)
 863 {
 864     Zag(tr[rt].lc);
 865     Zig(rt);
 866     return ;
 867 }
 868 
 869 void Zigzag(int &rt)
 870 {
 871     Zig(tr[rt].rc);
 872     Zag(rt);
 873     return ;
 874 }
 875 
 876 void Maintain(int &rt)
 877 {
 878     if(tr[tr[rt].lc].h==tr[tr[rt].rc].h+2)
 879     {
 880         if(tr[tr[rt].lc].h==tr[tr[tr[rt].lc].lc].h+1)   Zig(rt);
 881         else Zagzig(rt);
 882     }
 883     else if(tr[tr[rt].lc].h+2==tr[tr[rt].rc].h)
 884     {
 885         if(tr[tr[rt].rc].h==tr[tr[tr[rt].rc].rc].h+1)   Zag(rt);
 886         else Zigzag(rt);
 887     }
 888     return ;
 889 }
 890 
 891 void Insert(int &rt, int val, int idx)
 892 {
 893     if(!rt)
 894     {
 895         tr[rt=++cnt].h=1;
 896         tr[rt].val=val, tr[rt].idx=idx;
 897         return ;
 898     }
 899     
 900     if(idx<tr[rt].idx)  Insert(tr[rt].lc, val, idx);
 901     else    Insert(tr[rt].rc, val, idx);
 902     
 903     Maintain(rt);
 904 
 905     return ;
 906 }
 907 
 908 int Delete(int &rt, int d)
 909 {
 910     int ans=0;
 911     if(!rt) ans=0;
 912     else if(!d)
 913     {
 914         if(!tr[rt].lc)
 915         {
 916             ans=tr[rt].val;
 917             rt=tr[rt].rc;
 918         }
 919         else
 920         {
 921             ans=Delete(tr[rt].lc, d);
 922             Maintain(rt);
 923         }
 924     }
 925     else if(d==1)
 926     {
 927         if(!tr[rt].rc)
 928         {
 929             ans=tr[rt].val;
 930             rt=tr[rt].lc;
 931         }
 932         else
 933         {
 934             ans=Delete(tr[rt].rc, d);
 935             Maintain(rt);
 936         }
 937     }
 938     return ans;
 939 }
 940 
 941 int main()
 942 {
 943     int d, val, idx;
 944     while(scanf("%d", &d)!=EOF&&d)
 945     {
 946         if(d==2)    printf("%d\n", Delete(root, 1));
 947         else if(d==3)   printf("%d\n", Delete(root, 0));
 948         else
 949         {
 950             scanf("%d%d", &val, &idx);
 951             Insert(root, val, idx);
 952         }
 953     }
 954     return 0;
 955 }
 956 
 957 
 958 
 959 
 960 /**************************************************
 961 
 962             模版:Tarjan
 963             题目:POJ1236 Network of Schools
 964             
 965 **************************************************/
 966 
 967 #include<iostream>
 968 #include<cstring>
 969 #include<cstdio>
 970 #include<stack>
 971 #define Min(a, b) ((a)<(b)?(a):(b))
 972 #define Max(a, b) ((a)>(b)?(a):(b))
 973 using namespace std;
 974 const int maxn=100+10;
 975 
 976 int n, ans1, ans2, tot, w[maxn];
 977 int cur, fir[maxn], nxt[maxn*maxn], ver[maxn*maxn];
 978 int idx, dfn[maxn], low[maxn];
 979 bool ins[maxn], in[maxn], out[maxn];
 980 stack<int> s;
 981 
 982 void Add(int x, int y)
 983 {
 984     ver[++cur]=y, nxt[cur]=fir[x], fir[x]=cur;
 985     return ;
 986 }
 987 
 988 void Tarjan(int u)
 989 {
 990     dfn[u]=low[u]=++idx;
 991     ins[u]=true;
 992     s.push(u);
 993 
 994     for(int i=fir[u], v; i; i=nxt[i])
 995         if(!dfn[v=ver[i]])
 996         {
 997             Tarjan(v);
 998             low[u]=Min(low[u], low[v]);
 999         }
1000         else if(ins[v]) low[u]=Min(low[u], low[v]);
1001 
1002     if(dfn[u]==low[u])
1003     {
1004         int v=s.top();
1005         s.pop();
1006 
1007         w[v]=++tot, ins[v]=false;
1008         while(v!=u)
1009         {
1010             v=s.top();
1011             s.pop();
1012             w[v]=tot, ins[v]=false;
1013         }
1014     }
1015     return ;
1016 }
1017 
1018 int main()
1019 {
1020     scanf("%d", &n);
1021     for(int i=1, j; i<=n; i++)  while(scanf("%d", &j)&&j)   Add(i, j);
1022     
1023     for(int i=1; i<=n; i++) if(!dfn[i]) Tarjan(i);
1024     
1025     for(int i=1; i<=n; i++)
1026         for(int k=fir[i], j; k; k=nxt[k])
1027         {
1028             if(w[i]==w[j=ver[k]])   continue;
1029             in[w[j]]=out[w[i]]=true;
1030         }
1031 
1032     for(int i=1; i<=tot; i++)   ans1+=(!in[i]), ans2+=(!out[i]);
1033 
1034     if(tot==1)  printf("1\n0\n");
1035     else printf("%d\n%d\n", ans1, Max(ans1, ans2));
1036     return 0;
1037 }
1038 
1039 
1040 
1041 
1042 /**************************************************
1043 
1044             模版:线段树
1045             题目:HDU1698 just a hook
1046 
1047 **************************************************/
1048 
1049 #include<iostream>
1050 #include<cstdio>
1051 #define kl (k<<1)
1052 #define kr ((k<<1)+1)
1053 #define mid ((l+r)>>1)
1054 using namespace std;
1055 const int maxn=100000+10;
1056 
1057 int T, n, m;
1058 struct node
1059 {
1060     int sum, col;
1061 }tr[maxn<<2];
1062 
1063 void Build(int k=1, int l=1, int r=n)
1064 {
1065     tr[k].col=1, tr[k].sum=r-l+1;
1066     if(l==r)    return ;
1067     Build(kl, l, mid);
1068     Build(kr, mid+1, r);
1069     return ;
1070 }
1071 
1072 void Push_down(int k, int l, int r)
1073 {
1074     if(tr[k].col)
1075     {
1076         tr[kl].col=tr[kr].col=tr[k].col;
1077         tr[kl].sum=tr[kl].col*(mid-l+1);
1078         tr[kr].sum=tr[kr].col*(r-mid);
1079         tr[k].col=0;
1080     }
1081     return ;
1082 }
1083 
1084 void Push_up(int k)
1085 {
1086     tr[k].sum=tr[kl].sum+tr[kr].sum;
1087     return ;
1088 }
1089 
1090 void Insert(int ll, int rr, int num, int k=1, int l=1, int r=n)
1091 {
1092     if(rr <l||r< ll) return ;
1093     if(ll<=l&&r<=rr)
1094     {
1095         tr[k].col=num, tr[k].sum=(r-l+1)*num;
1096         return ;
1097     }
1098     Push_down(k, l, r);
1099     Insert(ll, rr, num, kl, l, mid);
1100     Insert(ll, rr, num, kr, mid+1, r);
1101     Push_up(k);
1102     return ;
1103 }
1104 
1105 int main()
1106 {
1107     scanf("%d", &T);
1108     for(int j=1; j<=T; j++)
1109     {
1110         scanf("%d%d", &n, &m);
1111         Build();
1112 
1113         for(int i=1, x, y, z; i<=m; i++)
1114         {
1115             scanf("%d%d%d", &x, &y, &z);
1116             Insert(x, y, z);
1117         }
1118 
1119         printf("Case %d: The total value of the hook is %d.\n", j, tr[1].sum);
1120     }
1121     return 0;
1122 }
1123 
1124 
1125 
1126 
1127 /**************************************************
1128 
1129             模版:线段树开区间
1130             题目:URAL1019 Line Painting
1131 
1132 **************************************************/
1133 
1134 #include<iostream>
1135 #include<cstring>
1136 #include<cstdio>
1137 #include<cstdlib>
1138 #include<algorithm>
1139 using namespace std;
1140 const int maxn=5000+10;
1141 #define kl (k<<1)
1142 #define kr ((k<<1)+1)
1143 #define mid ((l+r)>>1)
1144 
1145 int n, m, h[maxn*8];
1146 struct Query
1147 {
1148     int x, y; bool cl;
1149     void Push(int a, int b, bool c) { x=a, y=b, cl=c; }
1150 }q[maxn];
1151 struct node
1152 {
1153     int cl, from, tot, ls, rs;
1154 }tr[maxn*8];
1155 
1156 void Build(int k=1, int l=1, int r=n)
1157 {
1158     if(l>=r)    return ;
1159     tr[k].cl=1, tr[k].from=h[l], tr[k].tot=tr[k].ls=tr[k].rs=h[r]-h[l];
1160     if(l+1==r)  return ;
1161     Build(kl, l, mid);
1162     Build(kr, mid, r);
1163     return ;
1164 }
1165 
1166 void Push_down(int k, int l, int r)
1167 {
1168     if(tr[k].cl!=-1)
1169     {
1170         tr[kl].cl=tr[kr].cl=tr[k].cl, tr[kl].from=h[l], tr[kr].from=h[mid];
1171         tr[kl].tot=tr[kl].ls=tr[kl].rs=tr[kl].cl*(h[mid]-h[l]);
1172         tr[kr].tot=tr[kr].ls=tr[kr].rs=tr[kr].cl*(h[r]-h[mid]);
1173     }
1174     return ;
1175 }
1176 
1177 void Push_up(int k, int l, int r)
1178 {
1179     if(tr[kl].cl!=-1&&tr[kl].cl==tr[kr].cl)
1180         tr[k].cl=tr[kl].cl, tr[k].from=h[l], tr[k].tot=tr[k].ls=tr[k].rs=tr[kl].cl*(h[r]-h[l]);
1181     else
1182     {
1183         tr[k].cl=-1, tr[k].from=tr[kl].from, tr[k].tot=tr[kl].tot, tr[k].ls=tr[kl].ls, tr[k].rs=tr[kr].rs;
1184         if(tr[kl].rs+tr[kr].ls>tr[k].tot)   tr[k].from=h[mid]-tr[kl].rs, tr[k].tot=tr[kl].rs+tr[kr].ls;
1185         if(tr[kr].tot>tr[k].tot)    tr[k].from=tr[kr].from, tr[k].tot=tr[kr].tot;
1186         if(tr[kl].ls==h[mid]-h[l])  tr[k].ls+=tr[kr].ls;
1187         if(tr[kr].rs==h[r]-h[mid])  tr[k].rs+=tr[kl].rs;
1188     }
1189     return ;
1190 }
1191 
1192 void Insert(int ll, int rr, bool cl, int k=1, int l=1, int r=n)
1193 {
1194     if(rr <l||r< ll)    return ;
1195     if(ll<=l&&r<=rr)
1196     {
1197         tr[k].cl=cl, tr[k].from=h[l], tr[k].tot=tr[k].ls=tr[k].rs=cl*(h[r]-h[l]);
1198         return ;
1199     }
1200     if(l+1>=r)  return ;
1201     Push_down(k, l, r);
1202     Insert(ll, rr, cl, kl, l, mid);
1203     Insert(ll, rr, cl, kr, mid, r);
1204     Push_up(k, l, r);
1205     return ;
1206 }
1207 
1208 int main()
1209 {
1210     while(scanf("%d", &m)!=EOF)
1211     {
1212         n=0;
1213         h[++n]=0, h[++n]=1e9;
1214 
1215         int x, y; char c[5];
1216         for(int i=1; i<=m; i++)
1217         {
1218             scanf("%d%d%s", &x, &y, c);
1219             h[++n]=x, h[++n]=y;
1220             q[i].Push(x, y, c[0]==w);
1221         }
1222 
1223         sort(h+1, h+1+n);
1224         n=unique(h+1, h+1+n)-(h+1);
1225         Build();
1226         
1227         for(int i=1; i<=m; i++)
1228         {
1229             q[i].x=lower_bound(h+1, h+1+n, q[i].x)-h;
1230             q[i].y=lower_bound(h+1, h+1+n, q[i].y)-h;
1231             Insert(q[i].x, q[i].y, q[i].cl);
1232         }
1233 
1234         printf("%d %d\n", tr[1].from, tr[1].from+tr[1].tot);
1235     }
1236     return 0;
1237 }
1238 
1239 
1240 
1241 
1242 /**************************************************
1243 
1244             模版:EXKMP
1245             题目:HDU4333 Revolving Digits
1246 
1247 **************************************************/
1248 
1249 #include<iostream>
1250 #include<cstring>
1251 #include<cstdio>
1252 using namespace std;
1253 const int maxn=200000+10;
1254 #define Max(a, b) ((a)>(b)?(a):(b))
1255 
1256 int T, n, m, nx[maxn], ex[maxn];
1257 char t[maxn], s[maxn];
1258 
1259 void Read()
1260 {
1261     scanf("%s", t);
1262     n=strlen(t);
1263 
1264     for(int i=0; i<n; i++)  s[i]=s[n+i]=t[i];
1265     m=n+n;
1266     
1267     memset(nx, 0, sizeof nx);
1268     memset(ex, 0, sizeof ex);
1269     return ;
1270 }
1271 
1272 void Exkmp()
1273 {
1274     nx[0]=n;
1275     for(int i=1; i<n; i++)
1276     {
1277         if(t[i]!=t[i-1])    break;
1278         nx[1]=i;
1279     }
1280     for(int i=2, j, k=1, p, w; i<n; i++)
1281     {
1282         p=k+nx[k]-1, w=nx[i-k];
1283         if(i+w<p+1) nx[i]=w;
1284         else
1285         {
1286             j=Max(p-i+1, 0);
1287             while(i+j<n && t[i+j]==t[j])    ++j;
1288             nx[i]=j, k=i;
1289         }
1290     }
1291 
1292     for(int i=0; i<n&&i<m; i++)
1293     {
1294         if(s[i]!=t[i])  break;
1295         ex[0]=i+1;
1296     }
1297     for(int i=1, j, k=0, p, w; i<m; i++)
1298     {
1299         p=k+ex[k]-1, w=nx[i-k];
1300         if(i+w<p+1) ex[i]=w;
1301         else
1302         {
1303             j=Max(p-i+1, 0);
1304             while(i+j<m && j<n && s[i+j]==t[j]) ++j;
1305             ex[i]=j, k=i;
1306         }
1307     }
1308     return ;
1309 }
1310 
1311 int Kmp()
1312 {
1313     nx[0]=0;
1314     for(int j=0, i=1; i<n; i++)
1315     {
1316         while(j && t[j]!=t[i])  j=nx[j-1];
1317         if(t[j]==t[i])  ++j;
1318         nx[i]=j;
1319     }
1320     return nx[n-1];
1321 }
1322 
1323 void Work()
1324 {
1325     int le=0, eq=0, gr=0;
1326     Exkmp();
1327 
1328     for(int i=0; i<n; i++)
1329     {
1330         if(ex[i]==n)    ++eq;
1331         else
1332         {
1333             if(s[i+ex[i]]>t[ex[i]]) ++gr;
1334             else ++le;
1335         }
1336     }
1337 
1338     int tmp=n-Kmp();
1339     int cnt=(n%tmp)?(1):(n/tmp);
1340     printf(" %d %d %d\n", le/cnt, eq/cnt, gr/cnt);
1341     return ;
1342 }
1343 
1344 int main()
1345 {
1346     scanf("%d", &T);
1347     for(int i=1; i<=T; i++)
1348     {
1349         printf("Case %d:", i);
1350         Read(), Work();
1351     }
1352     return 0;
1353 }
1354 
1355 
1356 
1357 
1358 /**************************************************
1359 
1360             模版:KMP
1361             题目:HDU1711 Number Sequence
1362 
1363 **************************************************/
1364 
1365 #include<iostream>
1366 #include<cstring>
1367 #include<cstdio>
1368 using namespace std;
1369 const int maxn=1000000+10;
1370 
1371 int T, n, m, a[maxn], b[maxn];
1372 int nx[maxn], ex[maxn];
1373 
1374 int Kmp()
1375 {
1376     nx[0]=0;
1377     for(int i=1, j=0; i<m; i++)
1378     {
1379         while(j&&b[j]!=b[i])    j=nx[j-1];
1380         if(b[j]==b[i])  ++j;
1381         nx[i]=j;
1382     }
1383     
1384     for(int i=0, j=0; i<n; i++)
1385     {
1386         while(j&&b[j]!=a[i])    j=nx[j-1];
1387         if(b[j]==a[i])  ++j;
1388         if(j==m)    return i-m+2;
1389     }
1390 
1391     return -1;
1392 }
1393 
1394 int main()
1395 {
1396     scanf("%d", &T);
1397     while(T--)
1398     {
1399         scanf("%d%d", &n, &m);
1400         for(int i=0; i<n; i++)  scanf("%d", &a[i]);
1401         for(int i=0; i<m; i++)  scanf("%d", &b[i]);
1402 
1403         printf("%d\n", Kmp());
1404     }
1405     return 0;
1406 }
1407 
1408 
1409 
1410 
1411 /**************************************************
1412 
1413             模版:最短路Dijkastra
1414             题目:HDU2544 最短路
1415             注意:针对正权图
1416 
1417 **************************************************/
1418 
1419 #include<iostream>
1420 #include<cstring>
1421 #include<cstdio>
1422 using namespace std;
1423 const int maxn=100+10;
1424 
1425 int n, m, d[maxn][maxn], s[maxn];
1426 bool vis[maxn];
1427 
1428 void Read()
1429 {
1430     memset(s, 0xf, sizeof s);
1431     memset(d, 0xf, sizeof d);
1432     memset(vis, false, sizeof vis);
1433 
1434     for(int i=1, u, v, c; i<=m; i++)
1435     {
1436         scanf("%d%d%d", &u, &v, &c);
1437         d[u][v]=d[v][u]=c;
1438     }
1439     return ;
1440 }
1441 
1442 void Work()
1443 {
1444     int S=1, T=n, u=1, v, cur, cnt=0;
1445     s[S]=0;
1446     while(cnt++<n)
1447     {
1448         vis[u]=true;
1449         for(int i=1; i<=n; i++)
1450         {
1451             if(vis[i])  continue;
1452             if(s[i]>s[u]+d[u][i])    s[i]=s[u]+d[u][i];
1453             if(s[i]<cur)    cur=s[i], v=i;
1454         }
1455         u=v, cur=s[0];
1456     }
1457     printf("%d\n", s[T]);
1458     return ;
1459 }
1460 
1461 int main()
1462 {
1463     while(scanf("%d%d", &n, &m)!=EOF&&n+m)   Read(), Work();
1464     return 0;
1465 }
1466 
1467 
1468 
1469 
1470 /**************************************************
1471 
1472             模版:最短路Floyd
1473             题目:HDU2544 最短路
1474 
1475 **************************************************/
1476 
1477 #include<iostream>
1478 #include<cstring>
1479 #include<cstdio>
1480 using namespace std;
1481 const int maxn=100+10;
1482 #define Min(a, b) ((a)<(b)?(a):(b))
1483 int n, m, d[maxn][maxn];
1484 
1485 void Read()
1486 {
1487     memset(d, 0xf, sizeof d);
1488     for(int i=1, u, v, c; i<=m; i++)
1489     {
1490         scanf("%d%d%d", &u, &v, &c);
1491         d[u][v]=d[v][u]=c;
1492     }
1493     return ;
1494 }
1495 
1496 void Work()
1497 {
1498     for(int k=1; k<=n; k++)
1499         for(int i=1; i<=n; i++)
1500             for(int j=1; j<=n; j++)
1501                 if(i!=j&&j!=k&&i!=k)
1502                     d[i][j]=Min(d[i][j], d[i][k]+d[k][j]);
1503     printf("%d\n", d[1][n]);
1504     return ;
1505 }
1506 
1507 int main()
1508 {
1509     while(scanf("%d%d", &n, &m)!=EOF&&n+m)  Read(), Work();
1510     return 0;
1511 }
1512 
1513 
1514 
1515 
1516 /**************************************************
1517 
1518             模版:最短路SPFA
1519             题目:HDU2544 最短路
1520             注意:可用于负权图
1521 
1522 **************************************************/
1523 
1524 #include<iostream>
1525 #include<cstring>
1526 #include<cstdio>
1527 #include<queue>
1528 using namespace std;
1529 const int maxn=100+10;
1530 
1531 int n, m, S, T, d[maxn][maxn], s[maxn];
1532 bool vis[maxn];
1533 queue<int> q;
1534 
1535 void Read()
1536 {
1537     memset(d, 0xf, sizeof d);
1538     memset(s, 0xf, sizeof s);
1539     for(int i=1, u, v, c; i<=m; i++)
1540     {
1541         scanf("%d%d%d", &u, &v, &c);
1542         d[u][v]=d[v][u]=c;
1543     }
1544     return ;
1545 }
1546 
1547 void Work()
1548 {
1549     s[S=1]=0, T=n;
1550 
1551     q.push(S), vis[S]=true;
1552     
1553     while(!q.empty())
1554     {
1555         int u=q.front();
1556 
1557         for(int i=1; i<=n; i++)
1558             if(s[i]>s[u]+d[u][i])
1559             {
1560                 s[i]=s[u]+d[u][i];
1561                 if(!vis[i]) q.push(i), vis[i]=true;
1562             }
1563         
1564         q.pop(), vis[u]=false;
1565     }
1566 
1567     printf("%d\n", s[T]);
1568     return ;
1569 }
1570 
1571 int main()
1572 {
1573     while(scanf("%d%d", &n, &m)!=EOF&&n+m)   Read(), Work();
1574     return 0;
1575 }
1576 
1577 
1578 
1579 
1580 
1581 /**************************************************
1582 
1583             模版:最小生成树Kuskal
1584             题目:POJ1258 Agri-Net
1585 
1586 **************************************************/
1587 
1588 #include<iostream>
1589 #include<cstdio>
1590 #include<queue>
1591 using namespace std;
1592 const int maxn=100+10;
1593 
1594 int n, fa[maxn], d[maxn][maxn];
1595 struct node
1596 {
1597     int u, v, c;
1598     bool operator <(const node&a)const { return c>a.c; }
1599 }p;
1600 priority_queue<node> q;
1601 
1602 void Read()
1603 {
1604     for(int i=1; i<=n; i++)
1605         for(int j=1; j<=n; j++)
1606             scanf("%d", &d[i][j]);
1607 
1608     while(!q.empty())   q.pop();
1609     for(int i=1; i<=n; i++)
1610         for(int j=i+1; j<=n; j++)
1611         {
1612             p.u=i, p.v=j, p.c=d[i][j];
1613             q.push(p);
1614         }
1615     return ;
1616 }
1617 
1618 int Rt(int x)
1619 {
1620     return (x==fa[x])?(x):(fa[x]=Rt(fa[x]));
1621 }
1622 
1623 void Work()
1624 {
1625     for(int i=1; i<=n; i++) fa[i]=i;
1626 
1627     int ans=0, cnt=1;
1628     while(cnt<n)
1629     {
1630         int u=Rt(q.top().u), v=Rt(q.top().v), c=q.top().c;
1631         q.pop();
1632         if(u==v)    continue;
1633         ++cnt, ans+=c;
1634         if(u<v) fa[v]=u;
1635         else fa[u]=v;
1636     }
1637 
1638     printf("%d\n", ans);
1639     return ;
1640 }
1641 
1642 int main()
1643 {
1644     while(scanf("%d", &n)!=EOF) Read(), Work();
1645     return 0;
1646 }
1647 
1648 
1649 
1650 
1651 /**************************************************
1652 
1653             模版:最小生成树Prim
1654             题目:POJ1258 Agri-Net
1655 
1656 **************************************************/
1657 
1658 #include<iostream>
1659 #include<cstring>
1660 #include<cstdio>
1661 using namespace std;
1662 const int maxn=100+10;
1663 
1664 int n, d[maxn][maxn], _min[maxn];
1665 bool vis[maxn];
1666 
1667 void Read()
1668 {
1669     for(int i=1; i<=n; i++)
1670         for(int j=1; j<=n; j++)
1671             scanf("%d", &d[i][j]);
1672     return ;
1673 }
1674 
1675 void Work()
1676 {
1677     memset(vis, false, sizeof vis);
1678     memset(_min, 0xf, sizeof _min);
1679 
1680     int u=1, v, cur=_min[0], cnt=1, ans=0;
1681     while(cnt++<n)
1682     {
1683         vis[u]=true;
1684         for(int i=1; i<=n; i++)
1685         {
1686             if(vis[i]||u==i)  continue;
1687             if(_min[i]>d[u][i]) _min[i]=d[u][i];
1688             if(_min[i]<cur) cur=_min[i], v=i;
1689         }
1690         u=v, ans+=cur, cur=_min[0];
1691     }
1692 
1693     printf("%d\n", ans);
1694     return ;
1695 }
1696 
1697 int main()
1698 {
1699     while(scanf("%d", &n)!=EOF) Read(), Work();
1700     return 0;
1701 }

 

model

标签:

原文地址:http://www.cnblogs.com/thea-rsl/p/5531921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!