欢迎来到SFWR的博客

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

 

posted @ 2019-08-27 17:10  SFWR  Views(128)  Comments(0Edit  收藏  举报