- 博客(16)
- 收藏
- 关注
原创 poj 2983(差分约束系统,bellman)
<br />思路:令x[i]表示i节点的绝对距离,那么根据题设可以列出两类方程:1、x[i]-x[j]=k;2、x[i]-x[j]>=1。其中x[i]-x[j]=k等价于x[i]-x[j]>=k;x[i]-x[j]<=k;那么原方程组就化为了不等式方程组。那么原问题就化为了差分约束系统是否有解的问题。其中在差分约束系统中如果存在负权回路(有时是正权)那么就表示不等式组无解。这便是我们要利用的条件。<br /> <br />参考代码:<br />#include <iostream> #include <c
2010-08-02 16:11:00
367
原创 poj 1201(差分约束系统,bellman)
<br /><br />DescriptionYou are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. <br />Write a program that: <br />reads the number of intervals, their end points and integers c1, ..., cn from the standard input, <br />computes the min
2010-08-02 15:58:00
452
原创 poj 1459(最大流)
<br />题意:在一个电路系统中有发电厂,有用电者,有变电站,发电厂只能生产电不能用电,用电者只能用电不能生产电,变电站只能传输电。<br /> <br />思路:这是一道很明显的最大流。建立一个超级源点0,从0到各个发电站建立一条容量为发电站产电数额的边,以保证每个发电站供出的电小于或等于自己的产电数额;建立一个超级汇点n+1,从各个用电者到n+1建一条容量为用电者最多用电数额的边;然后对题中给定的m个triplets建边。最后从0到n+1求最大流。<br /> <br />参考代码:<br />#in
2010-08-02 15:22:00
405
原创 poj 3020(匈牙利,最少路径覆盖)
<br />题意:给定一张图和一些需要被覆盖的点,相邻的两点可以被一条直线覆盖。<br /> <br />思路:建立二分图,v1是图中的一些需要被覆盖的点,v2是另外一些需要被覆盖的点,其中v1与v2不相交,并且v1或v2中不包含相邻的点,那么问题即是求最少路径覆盖了!<br /> 这里由于图是无向的,所以可以v1=v2,而所求得的最大匹配数除以2就等于实际匹配数。<br /> 但我们是求最少路径覆盖,根据定理:最少路径覆盖=顶点数-最大匹配数。假设我们在所建图中求得的最大匹配为
2010-08-02 11:26:00
353
原创 poj 3041(二分匹配,匈牙利)
<br />题意:给定一个网格和网格上的一些点要求用最少的竖线或直线覆盖所有的点。<br /> <br />思路:如果把网格的行号和列号看成点,然后用点的行坐标和列坐标建边,那么如果一个点集覆盖了所有的边,那么根据这个点集作竖线或横线就一定可以覆盖所有网格上的点。这样问题就转换为求最少点覆盖了。<br />#include <iostream> #include <cstdio> using namespace std; int n; bool edge[505][505]; int li
2010-08-02 10:15:00
296
原创 poj 1094(拓扑排序)
<br />题意:给定一组字母的大小关系判断它们是否能组成唯一的拓扑序列。<br /> <br />思路:简单的拓扑排序。但需注意一点:在拓扑序列不能确定的时候如果存在环那么函数应该返回拓扑序列有环时对应的值而不是不能确定时对应的值。<br /> <br />参考代码:<br />#include <iostream> #include <cstdio> using namespace std; char str[6]; int map1[10000],map2[10000]; int n
2010-08-02 09:36:00
912
原创 poj 3026(BFS+最小生成树)
<br />题意:给定一张地图,其中包含源点S和A,要求S到所有A点的最短距离的和,另外公共路径不应该算在和中。<br /> <br />思路:这是一道明显的求最小生成树的题目。首先求出图中的每个A点和S点到其他A点和S点的最短路径,然后根据求得的路径建边,最后prim。<br /> <br />参考代码:<br />#include <iostream> #include <cstdio> using namespace std; #define MAX 1000000 char st
2010-08-01 22:13:00
448
原创 poj 1258(最小生成树)
<br />题意:。。。<br /> <br />思路:。。。<br /> <br />参考代码:<br />#include <stdio.h> #include <stdlib.h> #define MAXN 105 int edge[MAXN][MAXN],n,closedge[MAXN],visited[MAXN]; int res; void prim() { int i,j,k,beg; memset(visited,0,sizeof(visite
2010-08-01 21:28:00
251
原创 poj 2485(最小生成树)
<br />题意:。。。<br /> <br />思路:。。。<br /> <br />参考代码:<br />#include<iostream> using namespace std; int edge[501][501]; bool flag[501]; int closedge[501]; int main() { // freopen("in.txt","r",stdin); int t,n,i,j,sum,Min; scanf("%d",&t); while(t
2010-08-01 21:26:00
374
1
原创 poj 1789(最小生成树)
<br />题意:。。。<br /> <br />思路:朴素的最短路算法,没什么可说的。<br /> <br />参考代码:<br />#include <cstdlib> #include <iostream> #include <queue> using namespace std; #define MAXN 2002 int n,visited[MAXN],closedge[MAXN],edge[MAXN][MAXN]; char str[MAXN][9]; int res;
2010-08-01 21:24:00
277
原创 poj 2240(bellman 最短路)
<br />题意:求从货币s出发经过一系列兑换再变成s后能否增加s货币值。<br /> <br />思路:看网上的标准做法都是用floyd求最短路的,但若图中存在正权回路的话是否能用floyd求得f[s][s]>1呢?我想不能。可能是这道题没有出现有正权回路的数据吧!<br /> <br />参考代码:<br />#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <map> u
2010-08-01 21:10:00
446
原创 poj 1125(最短路)
<br />题意:求从谁发布谣言能使最后得到谣言的人的时间最少。<br /> <br />思路:枚举源点求最短路。<br /> <br />参考代码:<br />#include <iostream> #include <cstdio> using namespace std; int edge[105][105],dist[105],n; bool vis[105]; #define MAX 10000000 int dij(int s) { int i,j,k; mem
2010-08-01 00:40:00
351
原创 poj 2253(最小生成树)
<br />题意:求包含节点1和2的最小生成树中最大的边。<br /> <br />思路:朴素的prim<br /> <br />参考代码:<br /> #include <iostream> #include <cstdio> #include <cmath> #include <queue> using namespace std; struct Point { double x,y; }p[205]; #define MAX 10e20 double edge[20
2010-08-01 00:01:00
247
原创 poj 1062(最短路——昂贵的聘礼)
<br />题意:题目是中文,这里不赘述!<br /> <br />思路:这题是一道还算比较难想到的最短路,建图按如下规则:<br /> 1、建立一个超级汇点n+1;<br /> 2、每个物品到n+1建一条边,权值为物品的价格;<br /> 3、如果够得j物品可以使得i物品优惠w,那么从i到j建一条w权值的边;<br /> 由于这里有个等级限制,枚举一个等级区间[low,high],那么求得的最短路(从1到n+1)上的每一个顶点(除去n+1)的
2010-07-31 23:31:00
323
原创 poj 1860(最短路)
<br />题意:求根据各种货币之间的汇率能否使某种货币升值。货币a兑换成b所得值是 (a-c[a][b])*r[a][b]。<br /> <br />思路:令dist[a]表示从s(最初所持货币)出发经过各种已知的汇率兑换成a所能得到的最大值。那么便可以发现一个明显的放缩条件:(dist[a]-c[a][b])*r[a][b]>dist[b]。如此便可以用bellman水了。另外需要注意的是不仅是存在正权回路的时候需要输出YES,当图中不存在正权回路,但通过求最长路后dist[s]>v时同样需要输出YES
2010-07-31 20:32:00
888
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅