uva 10603 Fill

来源:互联网 发布:wmware 怎么安装mac os 编辑:程序博客网 时间:2024/06/09 20:56
#include<iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;const int maxn=1000;int ans[maxn];int vis[maxn][maxn];struct node{    int v[3],dist;    bool operator < (const node &rhs) const {        return dist>rhs.dist;    }};void up_data(node u){    for(int i=0;i<3;i++)    {        int d=u.v[i];        if(ans[d]<0||u.dist<ans[d]) ans[d]=u.dist;    }}void solve(int a,int b,int c,int d){    int cap[3];    cap[0]=a;cap[1]=b;cap[2]=c;    memset(vis,0,sizeof(vis));    memset(ans,-1,sizeof(ans));    node u;    u.v[0]=0;u.v[1]=0;u.v[2]=c;u.dist=0;    priority_queue<node> q;    q.push(u);    vis[0][0]=1;    while(!q.empty())    {        node u2=q.top();q.pop();        if(ans[d]>=0) break;        up_data(u2);        for(int i=0;i<3;i++)            for(int j=0;j<3;j++){                if(i!=j)                {                    if(u2.v[i]==0||u2.v[j]==cap[j]) continue;                    node u3;//此题唯一错的点,一开始没有弄一个u3,直接把u2推进队列了,导致后续展开不了,以后记住,如果要进堆栈队列,但是这个变量接下来还要处理的情况下,申请一个新变量,再把新变量推进去。                    memcpy(&u3,&u2,sizeof(u2));                    int amount=min(cap[j],u2.v[i]+u2.v[j])-u2.v[j];                    u3.v[i]-=amount;                    u3.v[j]+=amount;                    u3.dist+=amount;                    if(!vis[u3.v[0]][u3.v[1]])                    {                        vis[u3.v[0]][u3.v[1]]=1;                        q.push(u3);                    }                }                            }    }    while(d>=0){        if(ans[d]>=0){            printf("%d %d\n",ans[d],d);            break;        }        d--;    }}int main(){    int t;    scanf("%d",&t);    int a,b,c,d;    while(t--)    {        scanf("%d%d%d%d",&a,&b,&c,&d);        solve(a,b,c,d);    }    return 0;}

0 0
原创粉丝点击