摘要: 水水的。给几个不等式:dis[b]-dis[a]>=2; 0#include#include#include#include#define inf 1000000000#define Maxn 10110#define Maxm 160000using namespace std;int index[Maxn],dis[Maxn],vi[Maxn],e,n,Que[2000100];struct Edge{ int to,next,val;}edge[Maxm];void init(){ memset(vi,0,sizeof(vi)); memset(index,-1,siz... 阅读全文
posted @ 2013-07-18 21:44 fangguo 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 思路:班长的糖果要比snoopy的多。并且要用手写堆栈,且堆栈的大小要开到20000000.#include#include#include#include#include#define inf 1000000000#define Maxn 30110#define Maxm 160000using namespace std;int index[Maxn],dis[Maxn],vi[Maxn],e,n,Que[20000100];struct Edge{ int to,next,val;}edge[Maxm];void init(){ memset(vi,0,sizeof(vi)... 阅读全文
posted @ 2013-07-18 21:11 fangguo 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 思路:我们先求一遍floyd,将各点的最短距离求出,然后将点按si的升序排序。dp[i][k]表示第i个点在第j时间所获得的最大效益,那么dp[i][k]=max(dp[ i ][ k ] , dp[ j ][ k-p[ i ].c-dis[ i ][ j ] ]+p[ i ].s); dis[i][j]为i与j的最短路径。#include#include#include#include#include#define inf 1p[j].s) for(k=t;k>=p[i].c+dis[p[i].num][p[j].num]&&k>=0;k--) ... 阅读全文
posted @ 2013-07-18 19:44 fangguo 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 思路:设dis[i]为从0点到第i点的序列总和。那么对于A B gt k 来讲意思是dis[B+A]-dis[A]>k; 对于A B lt k来讲就是dis[B+A]-dis[A] 2 #include 3 #include 4 #include 5 #define Maxn 1100 6 #define inf 1<<30 7 using namespace std; 8 int dis[Maxn],vi[Maxn],n,index[Maxn],e; 9 struct Edge{10 int from,to,val,next;11 }edge[Maxn*1000];12 v 阅读全文
posted @ 2013-07-18 14:42 fangguo 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 思路:设dis[i]为标号为i的点到0号点的距离。对于P A B X,我们能得到等式dis[a]-dis[b]=x,那么可以化为两个不等式dis[a]-dis[b]>=x和dis[b]-dis[a]>=-x。这样就可以建两条边。V A B的话,我们知道dis[a]-dis[b]>=1,可以建一条边。这些边建起来后,图可能是一个离散的图,那么我们就定义一个超级源点连接所有的点,权值为0.进行求最长路时,只要判断是否有正圈存在,正圈的含义是绕着这个圈使每个点的dis值不断增大。用bellman-ford算法就行。还有一个笨的方法,其实是卡数据的,我们就用spfa求最长路,若循环次 阅读全文
posted @ 2013-07-18 10:20 fangguo 阅读(181) 评论(0) 推荐(0) 编辑
摘要: http://www.cnblogs.com/wangfang20/p/3196858.html题意:求集合Z中至少要包含多少个元素才能是每个区间[ai,bi]中的元素与Z中的元素重合个数为ci。思路:对于dis[b]-dis[a]>=c的形式,我们建一条a到b的边,权值为c,最后求最长路就是要得到的最小值。可举一例,[1,8]假使有7个不同的数,[1,4]假使有2个不同的数,[4,8]假使有3个不同的数,都满足f[8]-f[1]>=7,f[4]-f[1]>=2,f[8]-f[4]>=3.若求最短路,那么肯定得到的结果是5,与f[8]-f[1]>=7相矛盾。故求得 阅读全文
posted @ 2013-07-17 21:20 fangguo 阅读(250) 评论(0) 推荐(1) 编辑
摘要: 思路:将ant与tree之间用距离来做权值,求最小权匹配就可以了。可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小。就像斜边永远比直角边长一样的道理。#include#include#include#include#include#define Maxn 110#define Eps 0.000001using namespace std;int sx[Maxn],sy[Maxn],match[Maxn],n;double lx[Maxn],ly[Maxn],weight[Maxn][Maxn],slack[Maxn];struct Point{ .. 阅读全文
posted @ 2013-07-17 14:52 fangguo 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 就是最基本的二分图最优匹配,将每个人向每个房子建一条边,权值就是他们manhattan距离。然后对所有权值取反,求一次最大二分图最优匹配,在将结果取反就行了。#include#include#include#include#define Maxn 110using namespace std;int n;//点的数目int lx[Maxn],ly[Maxn]; //顶点标号int weight[Maxn][Maxn];// 边的权值int slack[Maxn];// Y(i)的松弛函数int sx[Maxn],sy[Maxn]; //标记X,Y中的顶点是否在交错路径上int match[Ma 阅读全文
posted @ 2013-07-17 11:33 fangguo 阅读(462) 评论(0) 推荐(0) 编辑
摘要: 题意:会给出M个串,我们要做的就是将这M个串给清除了。对于任意两个串,若二进制形式只有一位不一样,那么这两个串可以在一次操作消除,否则每个操作只能消除一个串。3 3*01100011可以代表的串是001101100011那么我们可以先用 10*把 101 和 100 消除了,再用 0*1把001 和 011 消除了。故操作次数为 2。解题思路:我们可以将所有的串先化为整数,并去重。然后对二进制形式只有一位不一样的两个数,我们由含有偶数个1的数向含有奇数个1的数连边,这样就确保了一定是二分图,因为不存在同含奇数个1或同含偶数个1 的数只相差一位。最后进行求最大匹配,既是我们可以省去的操作数。所以 阅读全文
posted @ 2013-07-16 21:21 fangguo 阅读(295) 评论(0) 推荐(1) 编辑
摘要: 思路:如果我们将认识的建边,求最大独立集就是互相不认识的人数。那么我们反过来,将不认识的建图,求最大独立集就是互相认识的人数。#include#include#include#include#define Maxn 210int graphic[Maxn][Maxn],vi[Maxn],match[Maxn],n,m;int dfs(int u){ int i; for(i=1;i<=m;i++) { if(!vi[i]&&graphic[u][i]) { vi[i]=1; if(match[i]==-1... 阅读全文
posted @ 2013-07-16 17:01 fangguo 阅读(127) 评论(0) 推荐(0) 编辑