随笔分类 -  ACM-树与图论

摘要:题目链接 http://cs.nyu.edu/courses/spring12/CSCI-GA.2560-001/prog1.html题目大意:给定n个任务的时间、价值及先后序关系,求一个可行的任务子集,使得时间之和不大于deadline,价值之和不小于targetVaule,且不可出现逆序。算法思路:题目已经给出算法,转化为状态空间搜索问题(tree-structured state space search problem),先对结点拓扑排序,存储前序的结点关系,然后先对状态搜索树进行BFS,可行的状态压入队列,到达到限制值后,再以队列中的状态为起点进行迭代深入搜索(Iterative d 阅读全文
posted @ 2012-02-16 01:28 yangleo 阅读(486) 评论(0) 推荐(0)
摘要:这题主要求二叉树结点到根结点的路径长度,基本的思路是 比较a与b,如果a大则当前结点是左孩子,a-b作为父结点的左数,父结点的右数与当前右数相等;如果b大则当前结点为右孩子,同理可以求父结点,直到父结点为(1,1)遍历结束。当用原始的递归算法会超时,需要考虑a=1或b=1的特殊情况,同时利用a与b的倍数关系加快遍历速度Source CodeProblem: 2499User: yangliuACMerMemory: 244KTime: 0MSLanguage: C++Result: Accepted#include <iostream> using namespace std; v 阅读全文
posted @ 2012-02-11 15:31 yangleo 阅读(551) 评论(1) 推荐(0)
摘要:此题关键要理解输出的定义For each test case, you should output a line contains an integer, which is the length of the longest road to be built such that all the villages are connected, and this value is minimum.输出是最小生成树中最长边的长度对prim算法稍作变化即可ACSource CodeProblem: 2485User: yangliuACMerMemory: 1232KTime: 750MSLangua 阅读全文
posted @ 2012-02-09 23:27 yangleo 阅读(224) 评论(0) 推荐(0)
摘要:思路:以物品为结点,物品之间的优惠价格为边权值建图,酋长10000金币当做0号结点,题意就是求图中各结点到0号结点的最短路长度,再加上终点处物品的价值,恰好就是探险家经过这个物品买卖途径所需要付出的金钱。用dijkstra算法求出单源最短路径,从各个结点的最短路径中选出最短的那条就是答案。基本还是经典最短路问题,但做了一点小小变形主要是:1 有结点等级限制,需要枚举等级2 把终点的物品价值计入最短路径中去,并且找最小的最短路径输出3 要注意是单向图,即物品替换关系是单向的Source CodeProblem: 1062User: yangliuACMerMemory: 300KTime: 32 阅读全文
posted @ 2012-01-03 19:23 yangleo 阅读(230) 评论(0) 推荐(0)
摘要:题意:车的类型用字符串来描述,两个汽车类型的距离定义为其字符串中不同字符的个数,给定所有的车的类型,求车之间的派生关系,使得总的距离最短,派生关系质量分最大算法:转化为图论问题,结点对应不同的汽车类型,边的权值就是不同结点字符串距离值,求最小生成树即可(因为题目说明了每个汽车只有一种汽车派生出)Source CodeProblem: 1789User: yangliuACMerMemory: 15688KTime: 422MSLanguage: C++Result: Accepted//00:31-0:53 20分钟写完 #include <iostream> using name 阅读全文
posted @ 2011-12-26 01:35 yangleo 阅读(224) 评论(0) 推荐(0)
摘要:还是最小生成树prim算法,套用的浙大模板#include <iostream>#define MAXN 28#define inf 10000typedef int elem_t;using namespace std;elem_t prim(int n,elem_t mat[MAXN][MAXN],int* pre){ elem_t min[MAXN],ret=0; int v[MAXN],i,j,k; for (i=0;i<n;i++) min[i]=inf,v[i]=0,pre[i]=-1; for (min[j=0]=0;j<n;j++){ ... 阅读全文
posted @ 2011-12-21 00:35 yangleo 阅读(179) 评论(0) 推荐(0)
摘要:典型的prim算法这类题目可以稍作变形,比如POJ2421#include <iostream>#include <map>#define MAXN 102typedef long elem_t;using namespace std;elem_t prim(int n,elem_t mat[MAXN][MAXN]){ elem_t closeEdge[MAXN],sum=0,min; int i,j,k; for(i = 0; i < n; i++) closeEdge[i] = mat[0][i];//初始化辅助数组 for(i = 1; i < n;. 阅读全文
posted @ 2011-12-21 00:34 yangleo 阅读(170) 评论(0) 推荐(0)
摘要:首先自己练习了一下实现dijkstra算法,可以把dj算法与prim算法对比记忆,要理解pre数组、min数组、V标记数组的含义!//单源最短路径,dijkstra算法,邻接阵形式,复杂度O(n^2)//求出源s到所有点的最短路经,传入图的顶点数n,(有向)邻接矩阵mat//返回到各点最短距离min[]和路径pre[],pre[i]记录s到i路径上i的父结点,pre[s]=-1//可更改路权类型,但必须非负!//可以把dj算法与prim算法对比记忆,要理解pre数组、min数组、V标记数组的含义!#include <iostream>#define MAXN 200#define 阅读全文
posted @ 2010-11-25 22:30 yangleo 阅读(224) 评论(0) 推荐(0)
摘要:此题求牛从起点到终点路径中最大权值最小的那条路径,将Floyd算法稍作修改即可,注意此题输入输出处理不当可能引起超时,一般scanf及printf更节省时间。#include <iostream>#include <cstdio>#define MAX_VEX 305#define MAX_WEI 1000005using namespace std;int A[MAX_VEX][MAX_VEX];//用cin,cout会超时int main(){ int N,M,T,i,j,k,h; int s,e,w; //cin>>N>>M>> 阅读全文
posted @ 2010-11-24 22:48 yangleo 阅读(194) 评论(0) 推荐(0)