Uva-10603 Fill

Posted asurudo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva-10603 Fill相关的知识,希望对你有一定的参考价值。

  1 #include<bits/stdc++.h>
  2 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
  3 #pragma GCC optimize(2)
  4 
  5 using namespace std;
  6 
  7 struct Node
  8 {
  9     int v[3],dist,fa;
 10     int from,to;
 11 };
 12 
 13 const int maxn = 200 + 5;
 14 int vis[maxn][maxn],cap[3],ans[maxn];
 15 vector<Node> nodes;
 16 
 17 void update_ans(const Node& u)
 18 {
 19     _for(i,0,3)
 20     {
 21         int d = u.v[i];
 22         if(ans[d] < 0 || u.dist < ans[d]) ans[d] = u.dist;
 23     }
 24 }
 25 
 26 struct cmp
 27 {
 28     bool operator () (const int a,const int b) const
 29     {
 30         return nodes[a].dist > nodes[b].dist;
 31     }
 32 };
 33 
 34 int final = 0;
 35 void solve(int a,int b,int c, int &d)
 36 {
 37     cap[0] = a,cap[1] = b,cap[2] = c;
 38     memset(vis,0,sizeof(vis));
 39     memset(ans,-1,sizeof(ans));
 40     nodes.clear();
 41     priority_queue<int,vector<int>,cmp> q;
 42     
 43     Node start;
 44     start.dist = 0;
 45     //c is full in the begining
 46     start.v[0] = 0,start.v[1] = 0,start.v[2] = c,start.fa = 0;
 47     start.from = start.to = -1;
 48     q.push(0);
 49     nodes.push_back(start);
 50     
 51     vis[0][0] = 1;
 52     while(!q.empty())
 53     {
 54         int u = q.top();q.pop();
 55         update_ans(nodes[u]);
 56         if(ans[d] >= 0)    {break;}
 57         _for(i,0,3)// i.water -> j.water
 58         {
 59             _for(j,0,3)
 60             {
 61                 // i is j or i is no-water or j is full
 62                 if(i==j || nodes[u].v[i]==0 || nodes[u].v[j] == cap[j]) continue;
 63                 //all of i in or a part of i in
 64                 int amount = min(cap[j],nodes[u].v[i]+nodes[u].v[j]) - nodes[u].v[j];
 65                 Node u2;
 66                 memcpy(&u2,&nodes[u],sizeof(Node));
 67                 u2.dist = nodes[u].dist+amount;
 68                 u2.v[i] -= amount;
 69                 u2.v[j] += amount;
 70                 u2.from = i;
 71                 u2.to = j;
 72                 if(!vis[u2.v[0]][u2.v[1]])
 73                 {
 74                     vis[u2.v[0]][u2.v[1]] = 1;
 75                     u2.fa = u;
 76                     nodes.push_back(u2);
 77                     q.push(nodes.size()-1);
 78                 }
 79             }
 80         }
 81     }
 82     while(d >= 0)
 83     {
 84         if(ans[d]>=0)
 85         {
 86             cout << "minimum water & goal" << endl;
 87             printf("%d %d

",ans[d],d);
 88             return ;
 89         }
 90         d --;
 91     }
 92 }
 93 
 94 void print_ans(int d)
 95 {
 96     int start;
 97     _for(i,0,nodes.size())
 98     {
 99         if(ans[d]==nodes[i].dist) {start = i;break;}
100     }
101     vector<vector<int>> rnt;
102     vector<int> tmp;
103     while(start)
104     {
105         tmp.clear();
106         tmp.push_back(nodes[start].v[0]);
107         tmp.push_back(nodes[start].v[1]);
108         tmp.push_back(nodes[start].v[2]);
109         tmp.push_back(nodes[start].from+1);
110         tmp.push_back(nodes[start].to+1);
111         rnt.push_back(tmp);
112         start = nodes[start].fa;
113     }
114     cout << "Begin:" << endl;
115     cout << nodes[0].v[0] << " " << nodes[0].v[1] << " " << nodes[0].v[2] << endl << endl;
116     for(int i = rnt.size()-1;i >= 0;i --)
117     {
118         cout << rnt[i][3] << "th -> " << rnt[i][4] << "th" << endl;
119         for(int j = 0;j < 3;j ++)
120         {
121             cout << rnt[i][j] << " ";
122         }
123         cout << endl << endl;
124     }
125     cout << "Question solved" << endl << endl << endl << endl;
126     cout << "**********" << endl;
127 }
128 
129 int main()
130 {
131 //    freopen("Miku.txt","w",stdout);
132     int T,a,b,c,d;
133     scanf("%d",&T);
134     while(T --)
135     {
136         scanf("%d%d%d%d",&a,&b,&c,&d);
137         solve(a,b,c,d);
138         print_ans(d);
139     }
140     return 0;
141 }

可以打印路径,基本上照抄刘汝佳

以上是关于Uva-10603 Fill的主要内容,如果未能解决你的问题,请参考以下文章

J - Fill (UVA - 10603)

UVa10603 倒水 Fill-状态空间搜索

UVA-10603-Fill(BFS+优先队列)

[UVa 10603] Fill

UVA - 10603 Fill

Uva-10603 Fill