POJ 3498 网络流英文阅读题
来源:互联网 发布:阿里云网站访问次数 编辑:程序博客网 时间:2024/05/16 23:58
一如既往的,我又把题意看错了....
题目大意:帝企鹅喜欢群居,现在有N块浮冰,给定企鹅跳跃能力D,给定Xi,Yi作为二维坐标,Ni为该浮冰上有多少企鹅,Mi为该浮冰上有多少企鹅离开后会破裂。问是否所有企鹅能否完成群居。
5 3.51 1 1 12 3 0 13 5 1 15 1 1 15 4 0 1
如上面这组数据,0,3,4浮冰上有企鹅,每块浮冰都能让一只企鹅离开。
构图还是很好的。因为每块浮冰有离开企鹅数量的上限,所以这块浮冰到其他可达浮冰的流量是有限制的,这个限制就是离开企鹅的数量。
比较直观不说了。我的做法是枚举聚合点,在聚合点连一条无穷大的容量边至汇点。
我看错的题意:把浮冰跳离企鹅的上限看成了,浮冰多少time后消失... 太丢脸了....
这样我死活没构出图来。只想到了一个100*200个点的图= =
谁知道告诉我一下.
#include<iostream>#include<string>#include<cstdio>#include<cstdlib>#define MN 222#define INF 0x00FFFFFF#define CC(what) memset( what,0,sizeof(what) )#define FF(i,a,b) for( int i=a;i<b;i++ )template<class T> void inline checkmin( T &a,T b ){ if( a==-1||a>b ) a=b; }using namespace std;int N,s,t,tot;double D;struct node{ int x,y; }p[MN];int maze[MN][MN],map[MN][MN],pre[MN],dis[MN],gap[MN],cur[MN];double dist( node a,node b ){ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}void setG(){ CC(maze);tot=0; scanf("%d%lf",&N,&D); s=0;t=2*N+1; FF(i,1,N+1){ scanf("%d%d",&p[i].x,&p[i].y); scanf("%d",&maze[s][i]); tot+=maze[s][i]; scanf("%d",&maze[i][i+N]); } FF(i,1,N+1)FF(j,i+1,N+1) if( dist(p[i],p[j])<=D*D){ maze[i+N][j]=INF; maze[j+N][i]=INF; }/* for( int i=0;i<=t;i++ ) { for( int j=0;j<=t;j++ ) printf( "%d ",maze[i][j] ); printf( "\n" ); } getchar(); getchar();*/}void initG(){ FF(i,s,t+1)FF(j,s,t+1) map[i][j]=maze[i][j];}bool sap( int ti ){ map[ti][t]=INF; CC(cur),CC(pre),CC(gap),CC(dis); int u=pre[s]=s,maxflow=0,aug=-1; gap[0]=t+1; while( dis[s]<=t ){loop:for( int v=cur[u];v<=t;v++ )if( map[u][v]&&dis[u]==dis[v]+1 ) { cur[u]=v; pre[v]=u; checkmin( aug,map[u][v] ); u=v; if( v==t ) { maxflow+=aug; for( u=pre[u];v!=s;v=u,u=pre[u] ) { map[u][v]-=aug; map[v][u]+=aug; } aug=-1; } goto loop;}int mind=t;for( int v=0;v<=t;v++ )if( map[u][v]&&mind>dis[v] ){ cur[u]=v; mind=dis[v]; } if( --gap[dis[u]]==0 )break; gap[dis[u]=mind+1]++; u=pre[u]; } //printf( "%d %d\n",ti,maxflow ); //getchar(); if( maxflow==tot )return true; else return false;}int main(){ int T; scanf( "%d",&T ); while( T-- ) { setG(); int rec[MN],len=0; FF( i,1,N+1 ){ initG(); if( sap(i) ) rec[len++]=i; } if( len>0 ){ printf( "%d",rec[0]-1 ); FF(i,1,len) printf( " %d",rec[i]-1 ); printf( "\n" ); } else printf( "-1\n"); } return 0;}
- POJ 3498 网络流英文阅读题
- POJ 2112 网络流英文阅读题
- POJ 2455 网络流英文阅读题
- POJ 3436 网络流 英文阅读题+技巧题
- ZOJ 2332 网络流英文阅读题
- POJ 1459 基本输入题&&英文阅读题
- POJ-2803 英文阅读+字符串处理
- 英文阅读
- 英文阅读
- 阅读英文
- POJ 3371 判断英文阅读轻松度(模拟)
- 英文文献阅读有感
- 阅读英文文献方法
- 程序员英文休闲阅读
- 英文深度阅读
- 英文书籍阅读助手
- 英文阅读指南
- 如何阅读英文文献
- 国外主流PHP框架比较
- jquery 引用 <base href=
- sed命令详解
- web 工具链的一些编辑技巧累积
- 解决Android的TextView不能自动换行的问题
- POJ 3498 网络流英文阅读题
- IniFile read & write source code
- MediaPlayer中设定数据源的几种方法
- AES 加密算法的 C 语言实现
- VC6.0工程属性配置(编译完成后对目标进行处理)
- windows Server 2003使用ip安全策略禁止某ip访问服务器的方法
- Android移动终端数据同步技术的一次了解
- 色环电阻
- 内存泄漏