QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#62228 | #4539. Independent Feedback Vertex Set | qinjianbin# | AC ✓ | 1027ms | 85996kb | C++17 | 2.5kb | 2022-11-17 17:23:47 | 2022-11-17 17:23:49 |
Judging History
answer
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
typedef long long LL;
const int maxn = 1e6+5;
int n;
int a[maxn];
map<int,int> num[maxn];
struct edgeType
{
int u,v;
edgeType(){}
edgeType(int _u,int _v):u(_u),v(_v){}
}edge[maxn];
int cntEdge;
int hp[maxn];
int he[maxn];
struct OppositeType
{
int to,nxt;
void add_connect(int u,int v,int x,int *head)
{
to=v;
nxt=head[u];
head[u]=x;
}
}pt[maxn],eg[maxn];
int cntConnect;
void standing_by()
{
int i;
int u,v,w;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(i=1;i<=3*n-6;i++) hp[i]=he[i]=-1;
edge[1]=edgeType(2,3);
edge[2]=edgeType(1,3);
edge[3]=edgeType(1,2);
pt[1].add_connect(1,1,1,hp);
pt[2].add_connect(2,2,2,hp);
pt[3].add_connect(3,3,3,hp);
eg[1].add_connect(1,1,1,he);
eg[2].add_connect(2,2,2,he);
eg[3].add_connect(3,3,3,he);
num[2][3]=num[3][2]=1;
num[1][3]=num[3][1]=2;
num[1][2]=num[2][1]=3;
cntEdge=3;
cntConnect=3;
for(i=4;i<=n;i++)
{
scanf("%d%d",&u,&v);
w=num[u][v];
edge[cntEdge+1]=edgeType(u,i);
edge[cntEdge+2]=edgeType(i,v);
num[u][i]=num[i][u]=cntEdge+1;
num[v][i]=num[i][v]=cntEdge+2;
pt[cntConnect+1].add_connect(w,i,cntConnect+1,hp);
eg[cntConnect+1].add_connect(i,w,cntConnect+1,he);
pt[cntConnect+2].add_connect(cntEdge+1,v,cntConnect+2,hp);
eg[cntConnect+2].add_connect(v,cntEdge+1,cntConnect+2,he);
pt[cntConnect+3].add_connect(cntEdge+2,u,cntConnect+3,hp);
eg[cntConnect+3].add_connect(u,cntEdge+2,cntConnect+3,he);
cntEdge+=2;
cntConnect+=3;
}
}
bool fp[maxn];
bool fe[maxn];
LL cur;
void dfs(int x,bool isPoint)
{
int i;
if (isPoint)
{
fp[x]=true;
cur+=a[x];
for(i=he[x];~i;i=eg[i].nxt)
{
if (fe[eg[i].to]) continue;
dfs(eg[i].to,false);
}
}else {
fe[x]=true;
for(i=hp[x];~i;i=pt[i].nxt)
{
if (fp[pt[i].to]) continue;
dfs(pt[i].to,true);
}
}
}
void complete()
{
int i;
LL ans;
for(i=1;i<=n;i++) fp[i]=false;
for(i=1;i<=cntEdge;i++) fe[i]=false;
cur=0;
dfs(1,true);
ans=cur;
for(i=1;i<=n;i++) fp[i]=false;
for(i=1;i<=cntEdge;i++) fe[i]=false;
cur=0;
dfs(2,true);
ans=max(ans,cur);
for(i=1;i<=n;i++) fp[i]=false;
for(i=1;i<=cntEdge;i++) fe[i]=false;
cur=0;
dfs(3,true);
ans=max(ans,cur);
printf("%lld\n",ans);
for(i=1;i<=n;i++) num[i].clear();
}
int main()
{
int t;
scanf("%d",&t);
for(;t;t--)
{
standing_by();
complete();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1027ms
memory: 85996kb
input:
1000 1561 14 78 18 74 80 97 70 49 39 81 79 65 55 1 29 32 91 73 94 41 69 41 79 34 62 81 25 33 76 26 57 69 66 48 37 78 67 50 21 8 27 58 58 32 8 42 31 52 35 36 99 56 61 27 4 64 50 59 43 55 73 53 41 80 94 32 56 59 19 57 28 56 35 73 70 13 18 6 96 47 71 29 16 73 65 27 61 68 50 11 21 96 19 18 33 97 6 43 19...
output:
26477 730 133872218725 206 139 26838 225784601561 409 163907525588 65 27568981002 26830437 612 206 647 3808763 392 39765006630 9823066 71309193 126 10667 93591615 12028 113 12356789 2420359 213 418 223 166 40 5324 219 1419 562 663 22941 14 39 102638547 14199134 58 201 12653791 101 10447 16511 171245...
result:
ok 1000 lines