题解—— 洛谷 p1269 信号放大器(贪心)

深刻的教训,不要写错读入

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 150001;
const int MAXM = 250001;
int cnt=0,u[MAXM],v[MAXM],w[MAXM],first[MAXN],next[MAXM];
int dis[MAXN],st,ans=0,n,fa[MAXN];
inline int qread(void){
    int x=0;
    char s;
    s=getchar();
    while(s>'9'||s<'0')
        s=getchar();
    while(s>='0'&&s<='9'){
        x*=10;
        x+=s-'0';
        s=getchar();
    }
    return x; 
}
inline void qwrite(int x){
    if(x>9){
    qwrite(x/10);
    }
    putchar(x%10+'0');
}
void addedge(int ux,int vx,int wx){
    ++cnt;
    u[cnt]=ux;
    v[cnt]=vx;
    w[cnt]=wx;
    next[cnt]=first[ux];
    first[ux]=cnt;
}
void dfs2(int x,int f){
    for(int i=first[x];i;i=next[i]){
        if(v[i]==f)
            continue;
        fa[v[i]]=w[i];
        dfs2(v[i],x);
        dis[x]=max(dis[v[i]]+w[i],dis[x]);
    }
    if(dis[x]+fa[x]>st){
        ans++;
        dis[x]=0;
        }
}
int main(){
    n=qread();
    int m=0;
    for(int i=1;i<=n;i++){
        int mid;
        mid=qread();
        for(int j=1;j<=mid;j++){
            int vx,wx;
            vx=qread();
            wx=qread();
            addedge(i,vx,wx);
            m=max(m,wx);
        }
    }
    st=qread();
    if(m>=st){
        printf("No solution.
");
        return 0;
    }
    dfs2(1,1);
    qwrite(ans);
    return 0;
}
原文地址:https://www.cnblogs.com/dreagonm/p/9420046.html