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 }
然而毒瘤卡空间。。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 }