求助各位,第10个点WA了。 看了一遍题解,觉得自己这个代码没有什么问题,麻烦各位了,94pts。
//
//
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN = 1e5+5;
const int INF = 0x3f3f3f3f;
struct edge{
int v,next;
}ed[MAXN*2];
int head[MAXN];
int topE;
void addE(int u,int v){
ed[++topE].v = v;
ed[topE].next= head[u];
head[u]=topE;
return;
}
int N;
double K;
int sum;
double ans;
int dp[MAXN][2];
int W[MAXN];
int deg[MAXN];
bool inQ[MAXN];
void topo(){
queue<int> q;
for(int i = 0;i<=N-1;++i){
if(deg[i]==1){
q.push(i);
inQ[i]=true;
}
}
while(!q.empty()){
int u = q.front();
q.pop();
dp[u][1]=W[u];
for(int i = head[u];i!=0;i=ed[i].next){
int v = ed[i].v;
if(!inQ[v]){
deg[v]--;
if(deg[v]==1){
inQ[v]=true;
q.push(v);
}
}else{
dp[u][0]+=max(dp[v][0],dp[v][1]);
dp[u][1]+=dp[v][0];
}
}
}
return;
}
int hsize;
bool vis[MAXN];
int H[MAXN];
void findH(int u,int father){
if(vis[u]){
return;
}
vis[u]=true;
H[++hsize]=u;
for(int i = head[u];i!=0;i=ed[i].next){
int v = ed[i].v;
if(vis[v]||v==father||inQ[v]){
continue;
}
findH(v,u);
}
return;
}
int main(){
scanf("%d",&N);
for(int i = 0;i<=N-1;++i){
scanf("%d",&W[i]);
}
for(int i = 1;i<=N;++i){
int u,v;
scanf("%d%d",&u,&v);
addE(u,v);
addE(v,u);
deg[u]++;
deg[v]++;
}
scanf("%lf",&K);
topo();
for(int i = 0;i<=N-1;++i){
if(!inQ[i]){
findH(i,-1);
break;
}
}
H[0]=-1;
for(int i = 1;i<=hsize;++i){
int u = H[i];
int fa = H[i-1];
dp[u][1]=W[u];
for(int j = head[u];j!=0;j=ed[j].next){
int v = ed[j].v;
if(!inQ[v]){
continue;
}
dp[u][0]+=max(dp[v][0],dp[v][1]);
dp[u][1]+=dp[v][0];
}
if(fa!=-1){
dp[u][0]+=max(dp[fa][0],dp[fa][1]);
dp[u][1]+=max(dp[fa][0],0);
}
if(i==1) {
dp[u][0]=-INF;
}
}
sum = max(dp[H[hsize]][0],dp[H[hsize]][1]);
for(int i = 1;i<=hsize;++i){
dp[H[i]][0]=dp[H[i]][1]=0;
}
for(int i = 1;i<=hsize;++i){
int u = H[i];
int fa = H[i-1];
dp[u][1]=W[u];
for(int j = head[u];j!=0;j=ed[j].next){
int v = ed[j].v;
if(!inQ[v]){
continue;
}
dp[u][0]+=max(dp[v][0],dp[v][1]);
dp[u][1]+=dp[v][0];
}
if(fa!=-1) {
dp[u][0] += max(dp[fa][0], dp[fa][1]);
dp[u][1] += max(dp[fa][0], 0);
}
}
sum = max(sum,dp[H[hsize]][0]);
ans = double(sum)*K;
printf("%.1lf",ans);
return 0;
}