上一页 1 ··· 24 25 26 27 28 29 30 31 32 ··· 61 下一页
摘要: 题目链接:http://poj.org/problem?id=2762思路:首先当然是要缩点建新图,由于题目要求是从u->v或从v->u连通,显然是要求单连通了,也就是要求一条长链了,最后只需判断链长是否等于新图顶点个数即可,至于如何求一条链长,直接dfs即可,注意点就是dfs是要从入度为0的顶点开始。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define MAXN 1010 9 10 int low[MAXN],dfn[MAXN],col 阅读全文
posted @ 2013-07-22 17:31 ihge2k 阅读(416) 评论(1) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3352思路:可以求出所有的桥,把桥删掉。然后把所有的连通分支求出来,显然这些连通分支就是原图中的双连通分支。把它们缩成点,然后添上刚才删去的桥,就构成了一棵树。在树上添边使得树变成一个双连通分支即可,这里我们可以直接统计缩点后的叶子节点个数即可,从而要加的边数即为(叶子节点个数+1)/2. 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 #define MAXN 222210 阅读全文
posted @ 2013-07-22 10:15 ihge2k 阅读(310) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3228思路:增设一个超级源点和一个超级汇点,源点与每一个gold相连,容量为gold数量,汇点与仓库相连,容量为仓库的容量,然后就是二分最小的最大相邻距离,跑最大流验证即可。最大流用的是别人的Dinic模版。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 222 8 #define inf 1 q; 30 while(!q.empty()) 31 q.p... 阅读全文
posted @ 2013-07-15 21:22 ihge2k 阅读(437) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3522思路:题目要求最小生成树中最大边与最小边的最小差值,由于数据不是很大,我们可以枚举最小生成树的最小边,然后kruskal求最小生成树,直到不能生成生成树为止,然后取最小的差值即可。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 111 7 #define inf 1<<30 8 9 struct Edge{10 int u,v;11 int len;12 }edge[MAXN*MAXN];1... 阅读全文
posted @ 2013-07-14 14:53 ihge2k 阅读(429) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2349思路:由于有S个专门的通道,我们可以先求一次最小生成树,然后对于最小生成树上的边从大到小排序,前S-1条边用S-1个卫星通道连接,那么第S大条边就是我们要找的最小的D了。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 555 8 #define inf 1LLq;29 }30 31 double Prim(int u0)32 {33 int cnt=0;34 memset... 阅读全文
posted @ 2013-07-13 19:51 ihge2k 阅读(903) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=1733思路:这题一看就想到要用并查集做了,不过一看数据这么大,感觉有点棘手,其实,我们仔细一想可以发现,我们需要记录的是出现过的节点到根节点的1个奇偶性,这与区间端点的大小并没有关系,于是想到我们可以用map映射即可,这样就解决了大数据了。此外,如果0表示出现偶数个1,1表示出现奇数个1,然后就是向量偏移关系了(http://www.cnblogs.com/wally/archive/2013/06/10/3130527.html). 1 #include 2 #include 3 #include 4 #include 5 #i 阅读全文
posted @ 2013-07-12 20:30 ihge2k 阅读(759) 评论(1) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3468思路:如果直接去做,每次都更新到叶子节点,那必然会TLE,我们可以采用lazy的思想:没必要每次更新都更新到叶子节点,只要有一个合适的范围就用一个增量来记录它,当下一次询问时,如果这个范围正好合适询问的范围,就直接是这个节点的sum值加上这个区间长度*lnc,再加到总和上去,若这个节点的范围不适合所要查询的范围,那么就要查询它的子节点,这个时候再把增量传给她的子节点,并且清空父亲节点的增量,这样效率能大大提高。 1 #include 2 #include 3 #include 4 #include 5 using ... 阅读全文
posted @ 2013-07-11 19:50 ihge2k 阅读(732) 评论(0) 推荐(1) 编辑
摘要: 题目链接:http://poj.org/problem?id=1182解题思路来自discuss:http://poj.org/showmessage?message_id=152847 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 50050 6 int parent[MAXN]; 7 int kind[MAXN]; 8 int n,m,tag; 9 10 void Initiate()11 {12 for(int i=0;in||b>n||(tag==2&&a==b)){ 阅读全文
posted @ 2013-07-10 19:05 ihge2k 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=1703思路;个人觉得本质上还是和带权并查集一样的,只不过多了一个MOD操作,然后就是向量关系图稍微改动一下就变成种类并查集了,对于本题,我们可以用一个kind数组来表示是否属于同一类,其中kind[x]==0表示不是同一类,kind[x]==1表示属于同一类,这样我们就可以得到向量关系式了(若r1=Find(u),r2=Find(v),并且parent[r1]=r2,那么就有kind[v]+1==kind[u]+kind[r1])然后变形后对2取余就可以了,即kind[r1]=(kind[v]-kind[u]+1)%2,这是Uni 阅读全文
posted @ 2013-07-09 21:00 ihge2k 阅读(468) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2413思路:由于要求最少的时间,可以考虑二分,然后就是满足在limit时间下,如果地球战舰数目比外星战舰数目多,就连边,然后求最大匹配即可,判断匹配数目是否等于外星球数目,如果相等,说明可以占领,继续二分。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace 阅读全文
posted @ 2013-06-19 00:21 ihge2k 阅读(266) 评论(0) 推荐(0) 编辑
上一页 1 ··· 24 25 26 27 28 29 30 31 32 ··· 61 下一页