P3125 [USACO15OPEN]Bessie的生日自助餐
题目是真的长==
还可以的DP题,就是老是想起来百毒之星TC
、哭
#include<bits/stdc++.h> using namespace std; int ne,head[100000],n,m,a,b,c,e,d[1001][1001],ans=-1,f[1001],vis[1001]; struct node{int to,nxt;}eg[100000<<1]; struct nod{int val,tag;}num[100000]; int cmp(nod x,nod y){return x.val<y.val;} void adde(int u,int v){eg[++ne].nxt=head[u];eg[ne].to=v;head[u]=ne;} void spfa(int x) { memset(vis,0,sizeof(vis)); queue<int>q; q.push(x);d[x][x]=0;vis[x]=1; while(!q.empty()) { int u=q.front(); vis[u]=0; q.pop(); for(int i=head[u];i;i=eg[i].nxt) { int v=eg[i].to; if(d[x][v]>d[x][u]+e) {d[x][v]=d[x][u]+e; if(!vis[v]){q.push(v);vis[v]=1;}} } } } int main() { cin>>n>>e; for(int i=1;i<=n;i++) { cin>>num[i].val>>c;num[i].tag=i; while(c--){cin>>a;adde(a,i);adde(i,a);} } sort(num+1,num+1+n,cmp); memset(d,0x3f,sizeof(d)); for(int i=1;i<=n;i++)spfa(i); for(int i=1;i<=n;i++)f[i]=num[i].val; for(int i=2;i<=n;i++)for(int j=1;j<i;j++) f[i]=max(f[i],f[j]+num[i].val-d[num[j].tag][num[i].tag]); for(int i=1;i<=n;i++) ans=max(ans,f[i]); cout<<ans; }