pku 3488 March of the Penguins 网络流+拆点

题意:
有N个点,每个点上有K只青蛙。每个点有限制起跳次数。问那些点青蛙们可以作为相聚地点
解法:
拆点,然后在两个分点中加入限制条件
代码:
  1# include <cstdio>
  2# include <cstring>
  3# include <cmath>
  4# include <vector>
  5using namespace std;
  6int n;
  7double d;
  8vector<int> ans;
  9# define le(a,b) (fabs((a)-(b))<1e-6||(a)<(b))
 10# define typec int // type of cost
 11# define inf  0xfffffff // max of cost
 12# define E 30000
 13# define N 300
 14struct edge int x, y, nxt; typec c; } bf[E];
 15int ne, head[N], cur[N], ps[N], dep[N];
 16void init()
 17{
 18    ne=0;
 19    memset(head,-1,sizeof(head));
 20}

 21void addedge(int x, int y, typec c)
 22// add an arc(x -> y, c); vertex: 0 ~ n-1;
 23    bf[ne].x = x; bf[ne].y = y; bf[ne].c = c;
 24    bf[ne].nxt = head[x]; head[x] = ne++;
 25    bf[ne].x = y; bf[ne].y = x; bf[ne].c = 0;
 26    bf[ne].nxt = head[y]; head[y] = ne++;
 27}

 28typec flow(int n, int s, int t)
 29{
 30    typec tr, res = 0;
 31    int i, j, k, f, r, top;
 32    while (1)
 33    {
 34        memset(dep, -1, n * sizeof(int));
 35        for (f = dep[ps[0= s] = 0, r = 1; f != r; )
 36            for (i = ps[f++], j = head[i]; j!=-1; j = bf[j].nxt)
 37                {
 38                    if (bf[j].c && -1 == dep[k = bf[j].y])
 39                    {
 40                        dep[k] = dep[i] + 1; ps[r++= k;
 41                        if (k == t)
 42                            { f = r; break; }
 43                    }

 44                }

 45        if (-1 == dep[t]) break;
 46        memcpy(cur, head, n * sizeof(int));
 47        for (i = s, top = 0; ; )
 48        {
 49            if (i == t)
 50            {
 51                for (k = 0, tr = inf; k < top; ++k)
 52                    if (bf[ps[k]].c < tr)
 53                        tr = bf[ps[f = k]].c;
 54                for (k = 0; k < top; ++k)
 55                    bf[ps[k]].c -= tr, bf[ps[k]^1].c += tr;
 56                res += tr; i = bf[ps[top = f]].x;
 57            }

 58            for (j=cur[i]; cur[i] != -1; j = cur[i] = bf[cur[i]].nxt)
 59                if (bf[j].c && dep[i]+1 == dep[bf[j].y]) break;
 60            if (cur[i] != -1)
 61            {
 62                ps[top++= cur[i];
 63                i = bf[cur[i]].y;
 64            }

 65            else
 66            {
 67                    if (0 == top) break;
 68                    dep[i] = -1; i = bf[ps[--top]].x;
 69            }

 70        }

 71    }

 72    return res;
 73}

 74
 75
 76struct node
 77{
 78   double x,y;
 79   int num,maxt;
 80}
data[101];
 81int main()
 82{
 83    //freopen("ans.txt","w",stdout);
 84    int test;
 85    scanf("%d",&test);
 86    while(test--)
 87    {
 88       int totalnum=0;
 89       ans.clear();
 90       scanf("%d%lf",&n,&d);
 91       for(int i=0;i<n;i++)
 92       {
 93          scanf("%lf%lf%d%d",&data[i].x,&data[i].y,&data[i].num,&data[i].maxt);
 94          totalnum+=data[i].num;
 95       }

 96       for(int target=0;target<n;target++)
 97       {
 98          init();
 99          for(int i=0;i<n;i++)
100          {
101             addedge(0,2*i+1,data[i].num);
102             addedge(2*i+1,2*i+2,data[i].maxt);
103             for(int j=0;j<i;j++)
104                if(le((data[i].x-data[j].x)*(data[i].x-data[j].x)+(data[i].y-data[j].y)*(data[i].y-data[j].y),d*d))
105                {
106              //    printf("%d,%d\n",i,j);
107                   addedge(2*i+2,2*j+1,inf);
108                   addedge(2*j+2,2*i+1,inf);
109                }

110          }

111          int tt=flow(2*n+1,0,2*target+1);
112          if(tt==totalnum)
113              ans.push_back(target);
114       }

115       if(ans.empty()) printf("-1\n");
116       else
117       {
118           printf("%d",ans[0]);
119           for(int i=1;i<ans.size();i++)
120             printf(" %d",ans[i]);
121           printf("\n");
122       }

123    }

124    return 0;
125}

126
127

posted on 2010-12-02 22:39 yzhw 阅读(148) 评论(0)  编辑 收藏 引用 所属分类: graph


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜