栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3498 March of the Penguins

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3498 March of the Penguins

#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<math.h>#include<queue>#define MAXN 2005#define MAXM 20000005#define oo 1000000007#define ll long longusing namespace std;  struct Dinic    {          struct node{      int x,y,c,next;          }line[MAXM];  int Lnum,_next[MAXN],dis[MAXN],dp[MAXN];      bool inqueue[MAXN];      void initial(int n){      for (int i=0;i<=n;i++) _next[i]=-1;     Lnum=-1;          }void addline(int x,int y,int c)          {      line[++Lnum].next=_next[x],_next[x]=Lnum;      line[Lnum].x=x,line[Lnum].y=y,line[Lnum].c=c;      line[++Lnum].next=_next[y],_next[y]=Lnum;      line[Lnum].x=y,line[Lnum].y=x,line[Lnum].c=0; }          bool BFS(int s,int e)          {       queue<int> Q;      while (!Q.empty()) Q.pop();      memset(dis,0,sizeof(dis));      dis[s]=1,Q.push(s);      while (!Q.empty())      { int h,k; h=Q.front(),Q.pop(); if (h==e) return dis[e]; for (k=_next[h];k!=-1;k=line[k].next)    if (line[k].c && !dis[line[k].y])       dis[line[k].y]=dis[h]+1,Q.push(line[k].y); }       return false;          }          int dfs(int x,int flow,int e) { if (x==e) return flow;         int temp,cost=0;        for (int k=_next[x];k!=-1;k=line[k].next)        if (line[k].c && dis[line[k].y]==dis[x]+1)        {    temp=dfs(line[k].y,min(flow-cost,line[k].c),e);     if (temp)    {line[k].c-=temp,line[k^1].c+=temp;cost+=temp;if (flow==cost) return cost;    }else dis[line[k].y]=-1;        }        return cost; } int MaxFlow(int s,int e)          {      int MaxFlow=0;       while (BFS(s,e)) MaxFlow+=dfs(s,oo,e);       return MaxFlow;          } }T;struct node{      int x,y,n,m;    }P[105];bool A[105][105];bool judge(int e,int n,int sum){      int i,j,s=n*2+5;      T.initial(n*2+5);      for (i=0;i<n;i++) T.addline(s,i<<1,P[i].n),T.addline(i<<1,i<<1|1,P[i].m);      for (i=0;i<n;i++)          for (j=0;j<n;j++) if (i!=j && A[i][j])    T.addline(i<<1|1,j<<1,oo);      return T.MaxFlow(s,e)==sum;}int main() { int n,C,i,j,sum,cases;      double v;      bool f;        scanf("%d",&C);      for (cases=1;cases<=C;cases++)      {    scanf("%d%lf",&n,&v),v*=v,sum=0;    for (i=0;i<n;i++)         scanf("%d%d%d%d",&P[i].x,&P[i].y,&P[i].n,&P[i].m),sum+=P[i].n;    for (i=0;i<n;i++)        for (j=0;j<n;j++)if ((P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y)<=v)        A[i][j]=true;  else A[i][j]=false;    f=true;    for (i=0;i<n;i++)       if (judge(i<<1,n,sum))       {   if (f) printf("%d",i);     else printf(" %d",i);   f=false;       }     if (f) printf("-1");    printf("n");      }      return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379554.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号