摘要: 题目大意,给出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) 编辑