随笔分类 -  ACM模板

摘要:1 #include 2 #include 3 #define MAX_V 10050 4 5 int V,E; //V表示顶点数,E表示边数(顶点标号为0~V-1) 6 vector G[MAX_V]; //图的邻接表表示 7 vector rG[MAX_V]; //把边反向后的图 8 vector vs; //后序遍历顺序的顶点列表(即用一个栈模拟了回溯时的标号) 9 bool used[MAX_V]; //DFS中用到的访问标记10 int cmp[MAX_V]; //顶点所属强连... 阅读全文
posted @ 2014-03-07 12:04 ~~Snail~~ 阅读(232) 评论(0) 推荐(0)
摘要:在几何问题中,运用向量的内积和外积进行计算是非常方便的。对于二维向量p1=(x1,y1)和p2=(x2,y2),我们定义内积p1·p2=x1*x2+y1*y2,外积p1×p2=x1*y2-y1*x2。 要判断点q是否在线段p1-p2上,只要先用外积跟据是否有(p1-q)×(p2-q)=0来判断点q是否在直线p1-p2上,再利用内积根据是否有(p1-q)·(p2-q)≤0来判断点q是否落在p1-p2之间。 要判断两条线段是否有交点,可以先求出两条线段所在直线的交点,再判断交点是否在两条线段上。(这里要注意考虑两条线段平行的情况,这种情况下不能直接求两条直线 阅读全文
posted @ 2014-02-28 21:52 ~~Snail~~ 阅读(756) 评论(0) 推荐(0)
摘要:1 #include 2 #include 3 #define MAX_V 80 4 5 int V; //顶点数 6 int match[MAX_V]; //所匹配的顶点 7 bool used[MAX_V]; //DFS中用到 的访问标记 8 vector G[MAX_V]; //图的邻接表表示 9 10 //向图中增加一条边接u和v的边11 void add_edge(int u,int v)12 {13 G[u].push_back(v);14 G[v].push_ba... 阅读全文
posted @ 2014-02-25 09:34 ~~Snail~~ 阅读(151) 评论(0) 推荐(0)
摘要:1 #include 2 #include 3 #include 4 #include 5 #define INF 0x7fffffff 6 #define MAX_V 210 7 8 using namespace std; 9 10 //用于表示边的结构体11 struct edge12 {13 int to; //终点14 int cap; //容量15 int rev; //反向边16 };17 18 int m,n;19 int iter[MAX_V]; //顶点到源咪的距离标号20 int level[MAX_V]; ... 阅读全文
posted @ 2014-02-25 09:28 ~~Snail~~ 阅读(190) 评论(0) 推荐(0)
摘要:1 #include 2 #include 3 #include 4 #define INF 0x7fffffff 5 #define MAX_V 210 6 7 using namespace std; 8 9 //用于表示边的结构体10 struct edge11 {12 int to; //终点13 int cap; //容量14 int rev; //反向边15 };16 17 int m,n;18 bool used[MAX_V]; //DFS中用到的访问标记19 vector G[MAX_V]; //用于保存图的邻接表,... 阅读全文
posted @ 2014-02-21 21:13 ~~Snail~~ 阅读(340) 评论(0) 推荐(0)
摘要:1 #define MAX_N 10000 2 3 int par[MAX_N]; 4 5 //并查集初始化,初始化n个元素 6 void init(int n) 7 { 8 for(int i=0;i<n;i++) 9 par[i]=i;10 }11 12 //并查集查询操作,查询树的根13 int Find(int x)14 {15 if(par[x]==x)16 return x;17 return par[x]=Find(par[x]);18 }19 20 //并查集合并操作,合并x和y所属集合21 void Unite(... 阅读全文
posted @ 2014-02-19 08:42 ~~Snail~~ 阅读(177) 评论(0) 推荐(0)
摘要:Floyd-Warshall算法用于求任意两点间的最短路问题 1 #define MAX_V 100 2 3 int d[MAX_V][MAX_V]; //d[u][v]表示边e=(u,v)的权值(不存在时设为INF,不过d[i][i]=0) 4 int V; //顶点数 5 6 int Min(int a,int b) 7 { 8 return a<b?a:b; 9 }10 11 void floyd_warshall()12 {13 for(int k=0;k<V;k++)14 for(int i=0;i<V;i++)15... 阅读全文
posted @ 2014-02-19 08:33 ~~Snail~~ 阅读(151) 评论(0) 推荐(0)
摘要:范围最小值问题(Range Minimum Query,RMQ)。给出一个长度为n的数组A1,A2,…,An,设计一个数据结构,支持查询操作Query(L,R):计算min{AL,AL+1,…,AR} 对于这种数组中元素不会进行更新的情形,最常用的是Tarjan的Sparse-Table算法,它用O(nlogn)的时间进行预处理,之后每次查询只要O(1)的时间,而且常数很小 设d[i][j]表示从 i 开始,长度为2^j的一段元素中的最小值,则可以得到递推关系:d[i][j] = min { d[i][j-1] , d[i+2^(j-1)][j-1] } 预处理代码如下: 1 #in... 阅读全文
posted @ 2014-02-07 12:29 ~~Snail~~ 阅读(1039) 评论(0) 推荐(0)
摘要:1 #include 2 #define MAX 100000 3 4 //数组c为树状数组,MAX为数状数组大小 5 int c[MAX]; 6 7 //lowbit函数 8 int lowbit(int x) 9 {10 return x&(-x);11 }12 13 //树状数组求和函数,求c[1]+c[2]+…+c[x]14 //注意如果题目中可能出现x=0的情况,这里会出现死循环而TLE,改进方法是将原数据全部+115 int sum(int x)16 {17 int ret=0;18 19 while(x>0)20 {21 re... 阅读全文
posted @ 2014-02-06 21:31 ~~Snail~~ 阅读(176) 评论(0) 推荐(0)