【usaco】patrol

很长时间都没想出来的简单题,看了题解才写出来,还是naive

原题:

FJ有个农场,其中有n块土地,由m条边连起来。FJ的养牛场在土地1,在土地n有个新开张的雪糕店。Bessie经常偷偷溜到雪糕店,当Bessie去的时候,FJ就要跟上她。但是Bessie很聪明,她在从雪糕店返回时不会经过去雪糕店时经过的农场,因此FJ总是抓不住Bessie。
为了防止Bessie生病,FJ决定把一些诚实的狗放在一些土地(1和n除外)上,使Bessie无法在满足每块土地最多只经过一次的条件的情况下,从养牛场溜到雪糕店然后又溜回养牛场。
求出FJ最少要放多少只狗。数据保证1和n间没有直接的连边。

n<=1000,m<=10000。

拆点来控制每个点只经过一次

先搞一个从源到汇每个点只经过一次的最小割,然后这个最小割-1,就是答案,似乎因为少拦一个点就相当于放开了另一条回去的路?

图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通图不一定连通

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int oo=168430090;
 8 int read(){int z=0,mark=1;  char ch=getchar();
 9     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)mark=-1;  ch=getchar();}
10     while(ch>=‘0‘&&ch<=‘9‘){z=(z<<3)+(z<<1)+ch-‘0‘;  ch=getchar();}
11     return z*mark;
12 }
13 struct ddd{int next,y,value,fan;}e[510000];int LINK[2100],ltop=0;
14 inline void insert(int x,int y,int z){
15     e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;e[ltop].value=z;e[ltop].fan=ltop+1;
16     e[++ltop].next=LINK[y];LINK[y]=ltop;e[ltop].y=x;e[ltop].value=0;e[ltop].fan=ltop-1;
17 }
18 int n,m;
19 int s=0,t;
20 int level[2100];
21 int dui[2100],tou=0;
22 bool get_level(){
23     memset(level,-1,sizeof(level));
24     dui[tou=1]=s;  level[s]=0;
25     for(int k=1;k<=tou;k++)
26         for(int i=LINK[dui[k]];i;i=e[i].next)if(e[i].value && level[e[i].y]==-1){
27                 dui[++tou]=e[i].y;
28                 level[e[i].y]=level[dui[k]]+1;
29         }
30     return level[t]!=-1;
31 }
32 int get_maxflow(int x,int y){
33     if(x==t)  return y;
34     int maxflow=0,flow=0;
35     for(int i=LINK[x];i;i=e[i].next)if(e[i].value && level[e[i].y]==level[x]+1)
36         if(flow=get_maxflow(e[i].y,min(y-maxflow,e[i].value))){
37             maxflow+=flow;
38             e[i].value-=flow,e[e[i].fan].value+=flow;
39         }
40     if(!maxflow)  level[x]=-1;
41     return maxflow;
42 }
43 int dinic(){
44     int flow,bowl=0;
45     while(get_level())
46         while(flow=get_maxflow(s,oo))
47             bowl+=flow;
48     return (bowl) ? bowl : 1;//注意图有可能不连通!!!
49 }
50 int main(){//freopen("ddd.in","r",stdin);
51     cin>>n>>m;
52     t=n*2+1;
53     int _left,_right;
54     insert(s,1,oo),insert(n+n,t,oo);
55     for(int i=2;i<n;i++)  insert(i,i+n,1);
56     insert(1,1+n,oo),insert(n,n+n,oo);
57     while(m --> 0){
58         _left=read(),_right=read();
59         insert(_left+n,_right,oo),insert(_right+n,_left,oo);
60     }
61     cout<<dinic()-1<<endl;
62     return 0;
63 }

时间: 2024-11-09 11:12:51

【usaco】patrol的相关文章

【USACO】checker

一看题目 经典的8皇后问题 不过是皇后数量可变而已 不用想 回溯法. 需要个生成每次可选择序列的函数, 在存储可选择的序列时按照先大后小的顺序排的.这样每次找最小和去掉最小都很方便,只要有个记录数量的变量 每次减1就好了.  写完后,居然悲剧了. 在皇后数量达到13时, 在自己电脑上跑 内存溢出了 在评分系统上超时了.需要优化. #include <stdio.h> //k计算第几层从0开始 x已经摆好的位置 S存放产生的位置 l存放产生的数量 N一共有多少位置可以选择 int calcula

【USACO】milk3

倒牛奶的问题, 开始看感觉跟倒水的问题很像, 想直接找规律, 写个类似于循环取余的代码. 但后来发现不行,因为这道题有三个桶,水量也是有限制的.只好用模拟的方法把所有的情况都试一遍. 建一个state[21][21][21]的数组存储出现过的状态.对于遍历状态,对每一种状态, 分别采用六种处理方法,若有新状态出现这将新状态置为1,同时标记flag++:若所有循环之后,flag == 0, 就说明遍历完成了. 开始脑子抽筋了, 写了个多出口的程序, 显然是错的.如下: int mothersmil

【USACO】calfflac

关键:以回文中心位置为变量进行遍历 //必须把纯字母先提出来 否则肯能会出现错误 比如: lvlv= 在检查长度4时 lvlv认为不是回文 vlv=认为是回文 但实际上 lvl 出现的要更早一些 //判断回文的方法 可以输入字符串后 左右比较 或者分别正序 逆序 存储 判断是否相等 //我的思路不对 严重超时了 我是以长度为变量进行循环 对于每个长度 每一个不同起始点的序列都需要对 整个序列重新判断一次是否为回文 O(n^3) //答案中 以中心字母为变量进行循环 只需要对每一个字母做为中心变量

【USACO】第一章总结

做了大半个月,终于把第一章做完了 有的题遇到了不小的坎儿,看着网上一群高中生都做得那么好,心理还是有些小郁闷的.不禁感慨我过去的四年真是虚度啊.总结一下第一章学习到的知识吧. ①闰年判断 int isleapyear(int N) { if((N%100 != 0 && N%4 ==0) || (N%400 == 0)) return 1; else return 0; } 计算闰年日期时可以用两个数组存放每个月的时间 int Year[12] = {31, 28, 31, 30, 31,

【USACO】Transformations

A square pattern of size N x N (1 <= N <= 10) black and white square tiles is transformed into another square pattern. Write a program that will recognize the minimum transformation that has been applied to the original pattern given the following l

【USACO】奶牛跑步2

P1443 - [USACO]奶牛跑步2 Description FJ的N(1 <= N <= 100,000)头奶牛们又兴高采烈地出来运动了!她们在一条无限长的小路上跑步,每头牛起跑的位置都不同,速度也不尽相同. 道路中划出了若干条跑道,以便她们能快速"超车",同一跑道中的任意两头牛都不会出现在相同的位置.不过FJ不愿让任何一头牛更换跑道或者调整速度,他想 知道如果让牛们跑足T(1 <= T <= 1,000,000,000)分钟的话,至少需要多少条跑道才能满

【USACO】beads

题目: You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples for n=29: 1 2 1 2 r b b r b r r b r b b b r r b r r r w r b r w w b b r r b b b b b b

【USACO】ariprog

输入 : N  M 要找到长度为 N 的等差数列,要求数列中每个数字都可以表达成 a^2 + b^2 的和, 数字大小不超过M^2 + M^2 输出: 等差数列首元素 间隔 (多组答案分行输出) 解题思路:因为等差数列的数字都是平房和数  所以先生成所有的 从0 - M^2 + M^2的平方和数 去掉相同的并从小到大排序 然后对 所有间隔 . 首元素 做循环 判断能否找到以该首元素和间隔为条件的其他N-1个需要的数字 可以就存成答案: 提交后超时了.... test 5的时候 超了5s 正在想简

【USACO】Mother&#39;s Milk(搜索)

一开始还在想去重的问题,结果发现后台数据貌似没有重复的情况= = /* ID: 18906421 LANG: C++ PROG: milk3 */ #include<cmath> #include<cstdio> #include<vector> #include<algorithm> using namespace std; const int maxn = 25; int vis[maxn][maxn][maxn] = {0}; vector<in