摘要: 题目大意:输入n个区间,每个区间有3个值,ai,bi,ci代表在区间[ai,bi]上至少要有ci个整数点,现在要满足所有区间的自身条件,问最少选多少个点。类似zoj 2770可以建模成一个差分约束系统.#include #include int n,dist[50010];struct e{ int u,v,w;}edges[50010];int mn,mx;bool bellman(){ int i,t; int f=1; while(f) { f=0; for(i=0;it) { dist[edges[i].v]=t; f=1; } } for(i=mn;it)... 阅读全文
posted @ 2013-08-17 19:41 贝尔摩德 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 题目大意:大家都知道,三国时期,蜀国刘备被吴国大都督陆逊打败了。刘备失败的原因是因为刘备的错误决策。他把部队分成几十个大营,每个大营驻扎一队部队,又用树木编成栅栏,把大营连成一片,称为连营。让我们回到那个时代。陆逊派了很多密探,获得了他的敌人-刘备的信息。通过密探,他知道刘备的部队已经分成几十个大营,这些大营连成一片(一字排开),这些大营从左到右用1...n编号。第i个大营最多能容纳Ci个士兵。而且通过观察刘备军队的动静,陆逊可以估计到从第i个大营到第j个大营至少有多少士兵。最后,陆逊必须估计出刘备最少有多少士兵,这样他才知道要派多少士兵去烧刘备的大营。为陆逊估计出刘备军队至少有多少士兵。然而 阅读全文
posted @ 2013-08-17 19:35 贝尔摩德 阅读(413) 评论(0) 推荐(0) 编辑
摘要: 题目大意,给出n个节点,m条边,每条边的权值表示从该条边走不被警察抓的概率,问从节点A到节点B不被抓的最大概率。floyd变形,只需将方程改为max[ i ][ j ] =MAX(max[ i ][ j ] ,max[ i ][ k ]*max[ k ][ j] )即可,初始时max[ i ][ j ]= 0,还有一点值得注意的是题目给的边的权值(即概率)是1到100之间的,直接乘的话可能会超空间,所以存储时先除以100。#include double max[110][110];int n,m;void floyd(){ int i,j,k; for(k=1;k<=n;k++) for 阅读全文
posted @ 2013-08-15 17:38 贝尔摩德 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 题目大意是给出世界地图,判断从国家A到国家B最少经过多少个国家。只需将每条边的权值赋为1,然后求最短路径即可。#include #define INF 10000int dist[25][25];int ob[400][2];void floyd(){ int i,j,k; for(k=1;kdist[i][k]+dist[k][j]) dist[i][j]=dist[i][k]+dist[k][j];}int main(){ int i,j,x,n,A,B,k; int sum=0; while(scanf("%d",&x)!=EOF) { sum++; for( 阅读全文
posted @ 2013-08-15 17:11 贝尔摩德 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 题意是在n个股票经纪人之间散播谣言,从 i 到 j 传到需要 t秒,问选定那个股票经纪人可以是谣言最快的使所有人都知道,并求出这个时间。直接floyd,遍历即可。#include #define INF 10000int n,m,dist[110][110];void floyd(){ int i,j,k; for(k=1;kdist[i][k]+dist[k][j]) dist[i][j]=dist[i][k]+dist[k][j];}int main(){ int i,j,k,t; int min,temp,pe; while(1) { scanf("%d",& 阅读全文
posted @ 2013-08-15 15:56 贝尔摩德 阅读(113) 评论(0) 推荐(0) 编辑
摘要: 题目大意,湖中有n个石头,一只青蛙要从一号石头上跳到2号石头上,要使所有可行路径中最大边最小,并输出该最大边。同zoj1952类似,动态规划,用dist[ i ][ j ]表示从 i 到 j 路径中的最长边,则枚举中间节点 k ,则状态转移方程为dist[ i ][ j ] = min(dist[ i ][ j ] , max(dist[i ][k ],dist[k ][j ])) ,形式同floyd相同。#include #include double min(double a,double b){ if(a>b) return b; else return a;}double max 阅读全文
posted @ 2013-08-15 14:39 贝尔摩德 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 题目大意是一张地图中n个公司建立一些点间的线路,对每次查询A,B,输出A,B间可通过哪些公司的线路连接。floyd变形,m[i ][j ]表示 i 到 j 间可以通过的公司的线路,对于公司的表示利用位运算,每个小写字母代表一个公司,所以不超过26位,如000.....00101代表公司a和c,0000....111代表公司a,b,c,则方程为m[ i ][ j ]|=m[ i ][ k ]&m[ k ][ j ]。#include #include int main(){ int m[300][300],n,A,B; int i,j,k; char str[30],ch; while( 阅读全文
posted @ 2013-08-15 10:43 贝尔摩德 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 题目的意思是选择路径并使从 i 到 j 的路径上最小承受重量最大化。动态规划,类似floyd,用dist[i ][ j]表示从 i 到 j 的最小重量,枚举中间节点 k ,则状态转移方程可写为dist[ i ][ j ] = max ( dist[ i ] [ j ], min ( dist[ i ][ k ],dist[ k ][ j ]))。index为命名函数,将英文名转换为标号。#include #include #define INF 5000000int n,r,num,dist[300][300];char city[300][50];char start[50],dest[50 阅读全文
posted @ 2013-08-14 15:39 贝尔摩德 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 题意是有n个国家,求从某点到某点运输的最小费用,且中间经过的点需要收税,还按字典序要打印出路径。floyd算法多加上枚举点的税即可。path[i ][j ]记录从i到j的第一个节点,当有相等的情况时比较两种path即可按字典序输出。#include #define INF 10000000int dist[1010][1010],n,path[1010][1010],b[1010];void floyd(){ int k,i,j,t; for(i=1;ipath[i][k]) path[i][j]=path[i][k]; } }} int main(){ in... 阅读全文
posted @ 2013-08-14 14:27 贝尔摩德 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 题目大意是有n个国家之间的汇率,问是否存在从一个国家出发回到该国家后汇率乘积大于一,即套汇。可以用bellman做,因为是回路,所以要递推n次(多于n次无意义,因为若存在套汇,n次就知道了)。也可以用floyd算法,最后判断lowdist[i ][i ]即可。#include #include int n,m,flag;double maxdist[50];char name[50][20],a[20],b[20];struct exchange{ int ci; int cj; double cij;}ex[1000];void bellman(int u){ int i,j; memset 阅读全文
posted @ 2013-08-14 10:56 贝尔摩德 阅读(166) 评论(0) 推荐(0) 编辑