P5201 [USACO19JAN] Shortcut G

 

 :::边 <<1 否则会TLE

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=5e4+10;

int head[maxn],to[maxn<<1],nxt[maxn<<1],w[maxn<<1],tot;
ll siz[maxn],canw[maxn<<1],usd[maxn];//usd->bian
ll dis[maxn<<1],vis[maxn],ans;
ll n,m,T;

void add(int u,int v,int val){
    to[++tot]=v,nxt[tot]=head[u],head[u]=tot,w[tot]=val;
}
void spfa()
{
    for(int i=1;i<=n;i++) dis[i]=1e18;
    //memset(dis,,sizeof(dis));
    memset(vis,0,sizeof(vis));
    
    queue<int> q;    q.push(1),vis[1]=1,dis[1]=0;
    while(q.size())
    {
        int u=q.front();q.pop();vis[u]=0;
        for(int i=head[u];i;i=nxt[i])
        {
            int v=to[i];
            if(dis[v]>dis[u]+w[i]) {
                dis[v]=dis[u]+w[i];
                if(vis[v]==0) q.push(v),vis[v]=1;    
            }        
        }
    }
    
}
void dfs(int u,int faa)
{
//    ddd
    for(int i=head[u];i;i=nxt[i])
    {
        if(canw[i]==0) continue;//== == == == == == 等号-> == 
        int v=to[i]; if(faa==v) continue;//!!!!!!!!!
        dfs(v,u);
        siz[u]+=siz[v];
        //ddd
    }
    ans=max(ans,(dis[u]-T)*siz[u]);
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n>>m>>T;
    for(int i=1;i<=n;i++) cin>>siz[i];
    for(int i=1;i<=m;i++){
        int u,v,val;cin>>u>>v>>val;
        add(u,v,val);add(v,u,val);
    }
    spfa();
    //因为边很多 在路径最短时 保证 连接编号小的 边 优先加入
    //边是 有 序号的 
    for(int u=1;u<=n;u++){//经过的点按 字典序  
        for(int i=head[u];i;i=nxt[i]){
            int v=to[i];
            if(usd[v]==0&&dis[v]==dis[u]+w[i]){
                usd[v]=1,canw[i]=1;
            }
        }
    }
    //ddd
    dfs(1,1);
//    for(int i=1;i<=n;i++) cout<<i<<"->"<<dis[i]<<"->"<<siz[i]<<endl;
//    for(int i=1;i<=m;i++) cout<<canw[i]<<endl;
    cout<<ans<<'\n';
    //cout<<maxn<<endl;
    
    return 0;
}
View Code

 

 
posted @ 2023-08-14 09:32  JMXZ  阅读(10)  评论(0)    收藏  举报