绿题做不出来要AFO了
查看原帖
绿题做不出来要AFO了
43144
jwkljwkl楼主2022/10/31 12:09
#include<bits/stdc++.h>
using namespace std;
const long long maxn=100005;
long long n,m,t,ans,a[maxn],s[maxn],d[maxn],pre[maxn];
bool b[maxn],f[maxn];
struct uu
{
    long long x,y;
};
bool operator<(uu a,uu b)
{
    return a.y>b.y;
}
priority_queue<uu>q;
vector<long long>u[maxn];
vector<uu>v[maxn];
void ss(long long x,long long fa)
{
    s[x]=a[x];
    for(auto y:u[x])
    {
        if(y==fa)continue;
        ss(y,x);
        s[x]+=s[y];
    }
    ans=max(ans,(d[x]-t)*s[x]);
}
int main()
{
    // freopen("a.in","r",stdin);
    // freopen("a.out","w",stdout);
    cin>>n>>m>>t;
    for(long long i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(long long i=1;i<=m;i++)
    {
        long long x,y,z;
        cin>>x>>y>>z;
        v[x].push_back({y,z});
        v[y].push_back({x,z});
    }
    memset(d,0x3f,sizeof(d));
    d[1]=0;
    q.push({1,0});
    while(!q.empty())
    {
        while(!q.empty()&&b[q.top().x])q.pop();
        b[q.top().x]=true;
        long long x=q.top().x;
        long long y=q.top().y;
        q.pop();
        for(auto y:v[x])
        {
            if(d[y.x]>d[x]+y.y||(d[y.x]==d[x]+y.y&&x<pre[y.x]))
            {
                pre[y.x]=x;
                d[y.x]=d[x]+y.y;
                if(!f[y.x])
                {
                    f[y.x]=true;
                    q.push({y.x,d[y.x]});
                }
            }
        }
    }
    for(long long i=2;i<=n;i++)
    {
        u[pre[i]].push_back(i);
        u[i].push_back(pre[i]);
    }
    ss(1,0);
    cout<<ans<<endl;
    return 0;
}
2022/10/31 12:09
加载中...