BZOJ4819: [Sdoi2017]新生舞会(01分数规划)
2018-06-17 21:08:21来源:未知 阅读 ()
Submit: 1029 Solved: 528
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9
Sample Output
HINT
Source
鸣谢infinityedge上传
// luogu-judger-enable-o2 #include<cstdio> #include<queue> #include<cstring> #include<cstdlib> #define INF 1e8+10 using namespace std; const int MAXN=201; const double eps=1e-7; #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin),p1==p2)?EOF:*p1++) char buf[1<<20],*p1=buf,*p2=buf; inline int read() { char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } struct node { int u,v,f,nxt; double w; }edge[MAXN*MAXN]; int head[MAXN],num=0; int N,S,T; int a[233][233],b[233][233]; double ans=0.0; inline void add_edge(int x,int y,int z,double k) { edge[num].u=x; edge[num].v=y; edge[num].f=z; edge[num].w=k; edge[num].nxt=head[x]; head[x]=num++; } inline void AddEdge(int x,int y,int z,double k) { add_edge(x,y,z,k); add_edge(y,x,0,-k); } int arrive[MAXN],vis[MAXN],pre[MAXN]; double dis[MAXN]; bool SPFA() { queue<int>q; q.push(S); for(register int i=S;i<=T;i++) dis[i]=-1e20,arrive[i]=0; memset(vis,0,sizeof(vis)); dis[S]=0;vis[S]=1; while(q.size()!=0) { int p=q.front();q.pop(); vis[p]=0;arrive[p]=1; for(int i=head[p];i!=-1;i=edge[i].nxt) { if(edge[i].f&&dis[edge[i].v]<dis[p]+edge[i].w) { dis[edge[i].v]=dis[p]+edge[i].w; pre[edge[i].v]=i; if(!vis[edge[i].v]) q.push(edge[i].v),vis[edge[i].v]=1; } } } return arrive[T]; } int dfs() { int mn=INF; int now=T; while(pre[now]) { mn=min(mn,edge[pre[now]].f); now=edge[pre[now]].u; } ans+=mn*dis[T]; now=T; while(pre[now]) { edge[pre[now]].f-=mn; edge[pre[now]^1].f+=mn; now=edge[pre[now]].u; } } bool check(double val) { memset(pre,0,sizeof(pre)); memset(head,-1,sizeof(head)); num=2; for(int i=1;i<=N;i++) AddEdge(S,i,1,0); for(int i=1;i<=N;i++) AddEdge(i+N,T,1,0); for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) AddEdge(i,j+N,1,a[i][j]-1.0*val*b[i][j]); ans=0.0; while(SPFA()) dfs(); if (ans<=0) return 1; else return 0; } int main() { #ifdef WIN32 freopen("a.in","r",stdin); //freopen("c.out","w",stdout); #else #endif N=read(); S=0,T=N*2|1; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) a[i][j]=read(); for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) b[i][j]=read(); double l=0,r=10000; while(r-l>=eps) { double mid=(l+r)/2; if(check(mid)) r=mid; else l=mid; } printf("%.6lf",l); return 0; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- LocalDB:微软的新生代轻量级数据库 2018-06-18
- 哈尔滨理工大学2016新生赛C题 2018-06-17
- BZOJ 4818 SDOI2017 序列计数 2018-06-17
- BZOJ 4819 新生舞会 2018-06-17
- 洛谷P3707 [SDOI2017]相关分析(线段树) 2018-06-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash