hdu 4001

来源:互联网 发布:解数独的软件 编辑:程序博客网 时间:2024/06/10 19:58

题目

大意:  n个立方体,一共有三种类型,每一种的方法有自己的规则,问组合后的最大高度


想法:  膜拜Wiking大神,轻松的说出了建图方法,然后就是加一个超级源点,以它为起点,对图进行SPFA求最长路,如果方块的类型是0,那么几个相同的会出现环,所以先把这些缩成一个点


#include<stdio.h>#include<string.h>#include<vector>#include<map>#include<queue>#include<algorithm>using namespace std;#define N 1005typedef pair<int,int>ii;typedef long long ll;struct node{    int a,b,d;    ll c;}p[N];struct edge{    int t;    ll w;};vector<edge>e[N];map<ii,ll>m;map<ii,ll>::iterator it;int n,a,b,d,num;ll dis[N],c;bool inq[N];int main(){  //  freopen("1.txt","r",stdin);    while(~scanf("%d",&n))    {        if(n==0) break;        num=1;        m.clear();        for(int i=0;i<n;i++)        {            scanf("%d%d%I64d%d",&a,&b,&c,&d);            if(a<b) swap(a,b);            if(d==0)            {                m[make_pair(a,b)]+=c;            }            else            {                p[num].a=a,p[num].b=b,p[num].c=c,p[num++].d=d;            }        }        for(it=m.begin();it!=m.end();it++)        {            p[num].a=it->first.first,p[num].b=it->first.second,p[num].c=it->second,p[num++].d=0;        }        for(int i=0;i<=num;i++) e[i].clear();        for(int i=1;i<num;i++)        {            for(int j=1;j<num;j++)            {                if(i==j) continue;                if(p[i].d==0)                {                    if(p[i].a>=p[j].a&&p[i].b>=p[j].b)                    {                        edge f;                        f.t=i,f.w=p[i].c;                        e[j].push_back(f);                    }                }                else if(p[i].d==1)                {                    if(p[i].a>=p[j].a&&p[i].b>=p[j].b&&!(p[i].a==p[j].a&&p[i].b==p[j].b))//一开始写的面积>面积,一直WA,为什么呢???因为我的a,b定义的是int,一乘就超了  ==                      {                        edge f;                        f.t=i,f.w=p[i].c;                        e[j].push_back(f);                    }                }                else if(p[i].d==2)                {                    if(p[i].a>p[j].a&&p[i].b>p[j].b)                    {                        edge f;                        f.t=i,f.w=p[i].c;                        e[j].push_back(f);                    }                }            }        }        for(int i=1;i<num;i++)        {            edge r;            r.t=i,r.w=p[i].c;            e[0].push_back(r);        }        memset(dis,0,sizeof(dis));        memset(inq,0,sizeof(inq));        queue<int>q;        q.push(0);        inq[0]=1;        while(!q.empty())        {            int x=q.front();q.pop();            inq[x]=0;            for(int i=0;i<e[x].size();i++)            {                edge r=e[x][i];                if(dis[r.t]<dis[x]+r.w)                {                    dis[r.t]=dis[x]+r.w;                    if(inq[r.t]==0)                    {                        inq[r.t]=1;                        q.push(r.t);                    }                }            }        }        ll ans=0;        for(int i=1;i<num;i++) ans=max(ans,dis[i]);        printf("%I64d\n",ans);    }    return 0;}


原创粉丝点击