Codeforces 498C Array and Operations(最大流)
题目是给一些数和<数对>的下标,然后进行操作:对某个<数对>中的两个数同时除以一个都能被它们整除且不等于1的数,要求的就是最多能进行多少次操作。
除数一定是素数,就是要决定某素数要除哪些<数对>使除的次数最多, ik + jk is an odd number 可以想到这个是个二分图,数最多100个,然后就用最大流做了。
有了POJ2516的经验之后,马上想到,素数是独立的,进行若干次最大流而不是拆若干点跑最大流(109大概最多拆30个点吧)。。
然后我还是没AC,因为我枚举素数只枚举到sqrt(109)。。。太傻逼了。。
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #include<algorithm>
- using namespace std;
- #define INF (1<<30)
- #define MAXN 111
- #define MAXM 111*111*2
- struct Edge{
- int v,cap,flow,next;
- }edge[MAXM];
- int vs,vt,NE,NV;
- int head[MAXN];
- void addEdge(int u,int v,int cap){
- edge[NE].v=v; edge[NE].cap=cap; edge[NE].flow=;
- edge[NE].next=head[u]; head[u]=NE++;
- edge[NE].v=u; edge[NE].cap=; edge[NE].flow=;
- edge[NE].next=head[v]; head[v]=NE++;
- }
- int level[MAXN];
- int gap[MAXN];
- void bfs(){
- memset(level,-,sizeof(level));
- memset(gap,,sizeof(gap));
- level[vt]=;
- gap[level[vt]]++;
- queue<int> que;
- que.push(vt);
- while(!que.empty()){
- int u=que.front(); que.pop();
- for(int i=head[u]; i!=-; i=edge[i].next){
- int v=edge[i].v;
- if(level[v]!=-) continue;
- level[v]=level[u]+;
- gap[level[v]]++;
- que.push(v);
- }
- }
- }
- int pre[MAXN];
- int cur[MAXN];
- int ISAP(){
- bfs();
- memset(pre,-,sizeof(pre));
- memcpy(cur,head,sizeof(head));
- int u=pre[vs]=vs,flow=,aug=INF;
- gap[]=NV;
- while(level[vs]<NV){
- bool flag=false;
- for(int &i=cur[u]; i!=-; i=edge[i].next){
- int v=edge[i].v;
- if(edge[i].cap!=edge[i].flow && level[u]==level[v]+){
- flag=true;
- pre[v]=u;
- u=v;
- //aug=(aug==-1?edge[i].cap:min(aug,edge[i].cap));
- aug=min(aug,edge[i].cap-edge[i].flow);
- if(v==vt){
- flow+=aug;
- for(u=pre[v]; v!=vs; v=u,u=pre[u]){
- edge[cur[u]].flow+=aug;
- edge[cur[u]^].flow-=aug;
- }
- //aug=-1;
- aug=INF;
- }
- break;
- }
- }
- if(flag) continue;
- int minlevel=NV;
- for(int i=head[u]; i!=-; i=edge[i].next){
- int v=edge[i].v;
- if(edge[i].cap!=edge[i].flow && level[v]<minlevel){
- minlevel=level[v];
- cur[u]=i;
- }
- }
- if(--gap[level[u]]==) break;
- level[u]=minlevel+;
- gap[level[u]]++;
- u=pre[u];
- }
- return flow;
- }
- int n,m,a[],x[],y[];
- bool isPrime(int x){
- if(x<) return ;
- for(int i=; i*i<=x; ++i) if(x%i==) return ;
- return ;
- }
- int main(){
- scanf("%d%d",&n,&m);
- for(int i=; i<=n; ++i) scanf("%d",a+i);
- for(int i=; i<=m; ++i){
- scanf("%d%d",x+i,y+i);
- if(y[i]&) swap(x[i],y[i]);
- }
- int res=;
- vs=; vt=n+; NV=vt+;
- for(int fact=; fact*fact<=; ++fact){
- if(!isPrime(fact)) continue;
- NE=;
- memset(head,-,sizeof(head));
- for(int i=; i<=m; ++i) addEdge(x[i],y[i],INF);
- for(int i=; i<=n; ++i){
- int cnt=;
- while(a[i]%fact==){
- a[i]/=fact;
- ++cnt;
- }
- if(i&) addEdge(vs,i,cnt);
- else addEdge(i,vt,cnt);
- }
- res+=ISAP();
- }
- for(int i=; i<=n; ++i){
- int fact=a[i];
- if(!isPrime(fact)) continue;
- NE=;
- memset(head,-,sizeof(head));
- for(int j=; j<=m; ++j) addEdge(x[j],y[j],INF);
- for(int j=; j<=n; ++j){
- if(a[j]!=fact) continue;
- a[j]=;
- if(j&) addEdge(vs,j,);
- else addEdge(j,vt,);
- }
- res+=ISAP();
- }
- printf("%d",res);
- return ;
- }
Codeforces 498C Array and Operations(最大流)的更多相关文章
- 网络流(最大流):CodeForces 499E Array and Operations
You have written on a piece of paper an array of n positive integers a[1], a[2], ..., a[n] and m goo ...
- codeforcese 498C. Array and Operations 网络流
题目链接 给n个数, m个数对, 每个数对是两个下标加起来为奇数的两个数.每次操作可以使一个数对中的两个数同时除某个数, 除的这个数是这两个数的任意约数, 问这种操作最多可以做几次.n<100, ...
- Codeforces Round #284 (Div. 1) C. Array and Operations 二分图最大匹配
题目链接: http://codeforces.com/problemset/problem/498/C C. Array and Operations time limit per test1 se ...
- Array and Operations
A. Array and Operations Time Limit: 1000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d ...
- cf498C Array and Operations
C. Array and Operations time limit per test 1 second memory limit per test 256 megabytes input stand ...
- CF498C. Array and Operations [二分图]
CF498C. Array and Operations 题意: 给定一个长为 n 的数组,以及 m 对下标 (a, b) 且满足 a + b 为奇数,每次操作可以将同一组的两个数同时除以一个公约数 ...
- Codeforces Round #284 (Div. 1) C. Array and Operations 二分图匹配
因为只有奇偶之间有操作, 可以看出是二分图, 然后拆质因子, 二分图最大匹配求答案就好啦. #include<bits/stdc++.h> #define LL long long #de ...
- Codeforces 797E - Array Queries
E. Array Queries 题目链接:http://codeforces.com/problemset/problem/797/E time limit per test 2 seconds m ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
随机推荐
- 改变edittext边框颜色
转载自:点击打开链接 第一步:为了更好的比较,准备两个一模一样的EditText(当Activity启动时,焦点会在第一个EditText上,如果你不希望这样只需要写一个高度和宽带为0的EditTex ...
- 我的grub.cfg配置文件
路径:/boot/grub/grub.cfg 配置文件如下: # # DO NOT EDIT THIS FILE # # It is automatically generated by grub-m ...
- 怎样从命令行进入mac桌面
www.iwangzheng.com 刚买的mac电脑,想在终端进入桌面,可以用下面的方式 点击桌面右上方的放大镜搜索到Terminal并打开,输入 $ cd /Users 这里会显示多个用户,进入自 ...
- C#开发实例 鼠标篇
鼠标的操作控制: 鼠标是计算机的一个重要组成部分,有很多默认的设置,如双击时间间隔,闪烁频率,移动速度等,本篇使用C#获取这些基本的信息. 1.1获取鼠标信息 ①实例001 获取鼠标双击时间间隔 主要 ...
- HDU 1707 简单模拟 Spring-outing Decision
Spring-outing Decision Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- 代码风格与树形DP
Streaming很惨,不过因为比赛之间没有提交过就没掉(或掉了)rating.第二题是一个树形DP,但是我都在想第一题了,简直作死. 看着神犇的代码我也是醉了...各种宏,真是好好写会死系列. 看到 ...
- 【SpringMVC】SpringMVC系列10之视图与视图解析器
10.视图与视图解析器 10.1.概述 请求处理方法执行完成后,最终返回一个 ModelAndView处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象, ...
- PHP+七牛云存储上传图片代码片段
2014年11月14日 16:37:51 第一段代码是上传单个图片的,第二个是上传多个图片的 //上传到七牛 //单个文件 //formname: 表单名字; pre: 图片Url中显示的图片名字(也 ...
- kindeditor的简单使用
上传到云: 一.引入kindeditor <%@ page language="java" contentType="text/html; charset=UTF- ...
- frameset框架下,刷新整个页面
<a href="index.jsp" target="_parent"> index.jsp主frameset页面