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; }

浙公网安备 33010602011771号