求助各位,WA#10
  • 板块P1453 城市环路
  • 楼主welen
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/8/21 12:48
  • 上次更新2023/11/6 19:46:34
查看原帖
求助各位,WA#10
65941
welen楼主2020/8/21 12:48

求助各位,第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;
}
2020/8/21 12:48
加载中...