bzoj 1791 [Ioi2008]Island 岛屿

https://www.lydsy.com/JudgeOnline/problem.php?id=1791

基环树模板题

原来的代码:(本机AC)

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<vector>
  5 using namespace std;
  6 #define fi first
  7 #define se second
  8 #define mp make_pair
  9 #define pb push_back
 10 typedef long long ll;
 11 typedef unsigned long long ull;
 12 typedef pair<int,int> pii;
 13 struct E
 14 {
 15     int to,nxt,d;
 16 }e[2000100];
 17 int f1[1000100],ne=1;
 18 void me(int x,int y,int z)
 19 {
 20     e[++ne].to=y;e[ne].nxt=f1[x];f1[x]=ne;e[ne].d=z;
 21     e[++ne].to=x;e[ne].nxt=f1[y];f1[y]=ne;e[ne].d=z;
 22 }
 23 int n;
 24 ll dd[1000100][2],ans=-0x3f3f3f3f3f3f3f3f;
 25 bool vis[1000100],oncir[1000100];//ll sh;
 26 void dfs(int u,int fa)
 27 {
 28     dd[u][0]=dd[u][1]=0;
 29     for(int v,k=f1[u];k;k=e[k].nxt)
 30         if(e[k].to!=fa&&!oncir[e[k].to])
 31         {
 32             v=e[k].to;
 33             dfs(v,u);
 34             if(dd[v][0]+e[k].d>=dd[u][0])
 35             {
 36                 dd[u][1]=dd[u][0];
 37                 dd[u][0]=dd[v][0]+e[k].d;
 38             }
 39             else if(dd[v][0]+e[k].d>=dd[u][1])
 40                 dd[u][1]=dd[v][0]+e[k].d;
 41         }
 42     ans=max(ans,dd[u][0]+dd[u][1]);
 43 }
 44 int cir[2000100];ll w[2000100],d0[2000100];
 45 int qq[2000100],ql,qr;
 46 int ff[1000100],fd[1000100];
 47 bool vv[1000100];
 48 ll anss;
 49 void dfs1(int u,int lst)
 50 {
 51     vis[u]=1;
 52     for(int v,k=f1[u];k;k=e[k].nxt)
 53         if((k!=(lst^1))&&(k!=lst))
 54         {
 55             v=e[k].to;
 56             if(vis[v])//可以证明此时v一定是u的祖先
 57             {
 58                 cir[++cir[0]]=v;
 59                 oncir[v]=1;
 60                 w[cir[0]+1]=e[k].d;
 61                 for(;!oncir[u];u=ff[u])
 62                 {
 63                     cir[++cir[0]]=u;
 64                     oncir[u]=1;
 65                     w[cir[0]+1]=fd[u];
 66                 }
 67             }
 68             else
 69             {
 70                 ff[v]=u;fd[v]=e[k].d;
 71                 dfs1(v,k);
 72             }
 73             if(cir[0])  return;
 74         }
 75 }
 76 void dfs0(int u)
 77 {
 78     vv[u]=1;
 79     for(int k=f1[u];k;k=e[k].nxt)
 80         if(!vv[e[k].to])
 81             dfs0(e[k].to);
 82 }
 83 int main()
 84 {
 85     int i,j,k,x,y;
 86     scanf("%d",&n);
 87     for(i=1;i<=n;i++)
 88     {
 89         scanf("%d%d",&x,&y);
 90         me(i,x,y);
 91     }
 92     for(k=1;k<=n;k++)
 93         if(!vv[k])
 94         {
 95             //printf("1t%d\n",k);
 96             cir[0]=0;ans=-0x3f3f3f3f3f3f3f3f;
 97             dfs1(k,0);
 98             for(i=1;i<=cir[0];i++)
 99                 cir[i+cir[0]]=cir[i];
100             for(i=1;i<=cir[0];i++)
101                 dfs(cir[i],0);
102             for(i=2;i<=cir[0];i++)
103                 w[i+cir[0]]=w[i];
104             for(i=1;i<=2*cir[0];i++)
105                 d0[i]=dd[cir[i]][0];
106             for(i=2;i<=2*cir[0];i++)
107                 w[i]+=w[i-1];
108             /*
109             for(i=1;i<=2*cir[0];i++)
110                 printf("%d ",cir[i]);
111             puts("1t");
112             for(i=1;i<=2*cir[0];i++)
113                 printf("%lld ",w[i]);
114             puts("2t");
115             for(i=1;i<=2*cir[0];i++)
116                 printf("%lld ",d0[i]);
117             puts("3t");
118             */
119             //sh=w[cir[0]+1];
120             for(i=1,j=1,ql=1,qr=0;i<=2*cir[0];i++)
121             {
122                 while(j<i&&i-j>=cir[0])
123                 {
124                     if(ql<=qr&&qq[ql]==j)    ++ql;
125                     ++j;
126                 }
127                 if(j<i)  ans=max(ans,w[i]+d0[i]-w[qq[ql]]+d0[qq[ql]]);
128                 //printf("3t%d %d %lld\n",i,j,ans);
129                 while(ql<=qr&&-w[qq[qr]]+d0[qq[qr]]<=-w[i]+d0[i])
130                     --qr;
131                 qq[++qr]=i;
132             }
133             anss+=ans;
134             //printf("2t%lld\n",ans);
135             dfs0(k);
136         }
137     printf("%lld",anss);
138     return 0;
139 }
View Code

然而毒瘤卡空间。。A不掉

卡了一个小时,全部改成bfs就A掉了

错误记录:91~93行没有用边判

  1 #include<cstdio>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<vector>
  5 #include<queue>
  6 using namespace std;
  7 #define fi first
  8 #define se second
  9 #define mp make_pair
 10 #define pb push_back
 11 typedef long long ll;
 12 typedef unsigned long long ull;
 13 typedef pair<int,int> pii;
 14 struct E
 15 {
 16     int to,nxt,d;
 17 }e[2000100];
 18 int f1[1000100],ne=1;
 19 void me(int x,int y,int z)
 20 {
 21     e[++ne].to=y;e[ne].nxt=f1[x];f1[x]=ne;e[ne].d=z;
 22     e[++ne].to=x;e[ne].nxt=f1[y];f1[y]=ne;e[ne].d=z;
 23 }
 24 int n;
 25 ll dd[1000100][2],ans=-0x3f3f3f3f3f3f3f3f;
 26 bool oncir[1000100];//ll sh;
 27 int t1[1000100];
 28 bool vv[1000100],v1[1000100],v2[1000100];
 29 int ff[1000100];
 30 queue<int> q;
 31 void dfs(int s)
 32 {
 33     int v,k,u,i;
 34     t1[0]=0;
 35     q.push(s);
 36     while(!q.empty())
 37     {
 38         u=q.front();q.pop();
 39         t1[++t1[0]]=u;
 40         for(k=f1[u];k;k=e[k].nxt)
 41             if(!v2[e[k].to]&&!oncir[e[k].to])
 42             {
 43                 ff[e[k].to]=u;
 44                 v2[e[k].to]=1;
 45                 q.push(e[k].to);
 46             }
 47     }
 48     for(i=t1[0];i>=1;i--)
 49     {
 50         u=t1[i];
 51         dd[u][0]=dd[u][1]=0;
 52         for(k=f1[u];k;k=e[k].nxt)
 53             if(e[k].to!=ff[u]&&!oncir[e[k].to])
 54             {
 55                 v=e[k].to;
 56                 if(dd[v][0]+e[k].d>=dd[u][0])
 57                 {
 58                     dd[u][1]=dd[u][0];
 59                     dd[u][0]=dd[v][0]+e[k].d;
 60                 }
 61                 else if(dd[v][0]+e[k].d>=dd[u][1])
 62                     dd[u][1]=dd[v][0]+e[k].d;
 63             }
 64         ans=max(ans,dd[u][0]+dd[u][1]);
 65     }
 66 }
 67 int cir[2000100];ll w[2000100],d0[2000100];
 68 int qq[2000100],ql,qr;
 69 ll anss;
 70 void dfs1(int s)
 71 {
 72     int k,j,u,lst;bool fl;
 73     q.push(s);v1[s]=1;
 74     while(!q.empty())
 75     {
 76         u=q.front();q.pop();
 77         for(k=f1[u];k;k=e[k].nxt)
 78             if(!v1[e[k].to])
 79             {
 80                 v1[e[k].to]=1;
 81                 q.push(e[k].to);
 82             }
 83     }
 84     //printf("9t%d\n",s);
 85     for(j=s,lst=0;;)
 86     {
 87         //printf("8t%d\n",j);
 88         cir[++cir[0]]=j;
 89         v2[j]=1;
 90         fl=0;
 91         for(k=f1[j];k;k=e[k].nxt)
 92             if(oncir[e[k].to]&&!v2[e[k].to]
 93                 &&(k!=lst)&&(k!=(lst^1)))
 94             {
 95                 fl=1;
 96                 j=e[k].to;
 97                 w[cir[0]+1]=e[k].d;
 98                 lst=k;
 99                 break;
100             }
101         if(!fl)
102         {
103             for(k=f1[j];k;k=e[k].nxt)
104                 if(e[k].to==s&&(k!=lst)&&(k!=(lst^1)))
105                 {
106                     w[cir[0]+1]=e[k].d;
107                     break;
108                 }
109             break;
110         }
111     }
112 }
113 int in[1000100];
114 int main()
115 {
116     int i,j,k,x,y,u;
117     scanf("%d",&n);
118     for(i=1;i<=n;i++)
119     {
120         scanf("%d%d",&x,&y);
121         me(i,x,y);++in[i];++in[x];
122     }
123     for(i=1;i<=n;i++)
124         oncir[i]=1;
125     for(i=1;i<=n;i++)
126         if(in[i]<=1)
127         {
128             oncir[i]=0;
129             q.push(i);
130         }
131     while(!q.empty())
132     {
133         u=q.front();q.pop();
134         for(k=f1[u];k;k=e[k].nxt)
135         {
136             --in[e[k].to];
137             if(in[e[k].to]<=1&&oncir[e[k].to])
138             {
139                 oncir[e[k].to]=0;
140                 q.push(e[k].to);
141             }
142         }
143     }
144     /*
145     for(i=1;i<=n;i++)
146         if(oncir[i])
147             printf("6t%d\n",i);/
148     */
149     for(k=1;k<=n;k++)
150         if(oncir[k]&&!v1[k])
151         {
152             //printf("1t%d\n",k);
153             cir[0]=0;ans=-0x3f3f3f3f3f3f3f3f;
154             dfs1(k);
155             for(i=1;i<=cir[0];i++)
156                 cir[i+cir[0]]=cir[i];
157             for(i=1;i<=cir[0];i++)
158                 dfs(cir[i]);
159             for(i=2;i<=cir[0];i++)
160                 w[i+cir[0]]=w[i];
161             for(i=1;i<=2*cir[0];i++)
162                 d0[i]=dd[cir[i]][0];
163             for(i=2;i<=2*cir[0];i++)
164                 w[i]+=w[i-1];
165             /*
166             for(i=1;i<=2*cir[0];i++)
167                 printf("%d ",cir[i]);
168             puts("1t");
169             for(i=1;i<=2*cir[0];i++)
170                 printf("%lld ",w[i]);
171             puts("2t");
172             for(i=1;i<=2*cir[0];i++)
173                 printf("%lld ",d0[i]);
174             puts("3t");
175             */
176             //sh=w[cir[0]+1];
177             for(i=1,j=1,ql=1,qr=0;i<=2*cir[0];i++)
178             {
179                 while(j<i&&i-j>=cir[0])
180                 {
181                     if(ql<=qr&&qq[ql]==j)    ++ql;
182                     ++j;
183                 }
184                 if(j<i)  ans=max(ans,w[i]+d0[i]-w[qq[ql]]+d0[qq[ql]]);
185                 //printf("3t%d %d %lld\n",i,j,ans);
186                 while(ql<=qr&&-w[qq[qr]]+d0[qq[qr]]<=-w[i]+d0[i])
187                     --qr;
188                 qq[++qr]=i;
189             }
190             anss+=ans;
191             //printf("2t%lld\n",ans);
192         }
193     printf("%lld",anss);
194     return 0;
195 }
View Code

 

posted @ 2018-10-17 09:18  hehe_54321  阅读(160)  评论(0编辑  收藏  举报
AmazingCounters.com