每个字符串可看成一点,每两个字符串不相同的字母的数量可看成两点之间的距离。求1/Q的最大值即相当于求最小生成树,用prim即可。#include<iostream>#include<stdio.h>#include<string.h>#define MAXD 2010#define INF 0x3f3f3f3fusing namespace std;int N,graph[MAXD][MAXD],res;char data[MAXD][8];void MST_PRIM(){ int key[MAXD],flag,p; bool vis[MAXD]; mems Read More
posted @ 2013-01-21 17:43 longlongago Views(120) Comments(0) Diggs(0) Edit
求最小生成树的最大边。#include<iostream>#include<stdio.h>#include<string.h>#define MAXD 510#define INF 0x3f3f3f3fusing namespace std;int T,N,graph[MAXD][MAXD],res;void MST_PRIM(){ int vis[MAXD],key[MAXD]; memset(vis,0,sizeof(vis)); memset(key,0x3f,sizeof(key)); key[1]=0; int i,j; for(i=1;i< Read More
posted @ 2013-01-21 15:50 longlongago Views(146) Comments(0) Diggs(0) Edit
用prim求最小生成树有点类似Dijkstra,把当前节点所联接的权重最小的边依次加入最小生成树中。#include<iostream>#include<stdio.h>#include<string.h>#define MAXD 110#define INF 0x3f3f3f3fusing namespace std;int N,graph[MAXD][MAXD],res,key[MAXD];void MST_PRIM(){ bool vis[MAXD]; memset(vis,0,sizeof(vis)); int k,i,t,w; for(i=1;i& Read More
posted @ 2013-01-21 11:09 longlongago Views(127) Comments(0) Diggs(0) Edit
也是典型的差分约束的题目。对于有提供两点间精确距离的情况要在两点间添加两条互相反向的边。用bellman-ford判断图中是否有负环即可。#include<iostream>#include<stdio.h>#include<string.h>#define MAXD 5000using namespace std;int N,M,u[MAXD*100],v[MAXD*100],w[MAXD*100],head[MAXD],next[MAXD*100],e,dis[MAXD];void add(int x,int y,int z){ u[e]=x; v[e] Read More
posted @ 2013-01-20 11:24 longlongago Views(114) Comments(0) Diggs(0) Edit
典型的差分约束的题目。#include<iostream>#include<stdio.h>#include<queue>#include<string.h>#define MAXD 110using namespace std;int N,M,graph[MAXD][MAXD],dis[MAXD];bool vis[MAXD][MAXD];int bellman(){ memset(dis,0x3f,sizeof(dis)); dis[0]=0; int k,i,j; int num=N+1; for(k=1;k<=num;k++) { Read More
posted @ 2013-01-17 18:00 longlongago Views(118) Comments(0) Diggs(0) Edit
与poj2240很像。大概题意是Nick有某种货币S,数量为V,总共有N种货币兑换(包括S),有M个交易点,每个交易点只兑换某两种货币,可能有几个交易点交易相同的货币,即两点之间可能存在几条权值不同的边。问是否有可能通过多次兑换使Nick手中的S货币增值。对图中的所有边进行松弛,如果在一次松弛所有边的操作中,对任意一点都没有增值作用,而此时d[S](S的数量)仍然小于等于V,则说明没有可能通过兑换使S增值。#include<iostream>#include<stdio.h>#include<string.h>#define MAXD 110using na Read More
posted @ 2013-01-01 23:43 longlongago Views(136) Comments(0) Diggs(0) Edit
这道题有好几种做法,这里用的是bellman。从起始币种src出发计算所有币种可兑换起始币种的最大值。用cin读取字符串貌似非常耗时,用了900+ms,差点超时。只是稍微用%s改下输入,就只用了32ms#include<iostream>#include<stdio.h>#include<string.h>#include<queue>#include<vector>#define MAXD 32#define INF 0x3f3f3f3fusing namespace std;int N,M;double graph[MAXD][M Read More
posted @ 2012-12-31 21:18 longlongago Views(138) Comments(0) Diggs(0) Edit
数据貌似很水的样子。用了N次Dijkstra来计算每点到其他各点距离的最大值,时间复杂度还是蛮大的,结果也是0ms。英语不好伤不起啊,题目看了好久才知道在干嘛。#include<iostream>#include<stdio.h>#include<string.h>#include<queue>#include<vector>#define MAXD 110#define INF 0x3f3f3f3fusing namespace std;int N,data[MAXD][MAXD],d[MAXD];bool graph[MAXD][ Read More
posted @ 2012-12-24 23:48 longlongago Views(129) Comments(0) Diggs(0) Edit
用bellman_ford判断图中有无负环。可假设存在某一源点到各点距离为0,即初始化数组value为零。数据里边的数貌似不止2500,最开始数组开小了结果RE。#include<iostream>#include<stdio.h>#include<string.h>#define MAXD 510using namespace std;int F,N,M,W,S,E,T;struct NODE{ int v1; int v2; int d; //d为边权值}node[10*MAXD]; //用node记录边int bellman_ford(){ int v Read More
posted @ 2012-12-20 01:17 longlongago Views(119) Comments(0) Diggs(0) Edit
要先分段枚举,在分别进行一次Dijkstra。例如M=2,酋长等级为3,则要分别枚举1~3、2~4、3~5。#include<iostream>#include<stdio.h>#include<string.h>#include<queue>#include<vector>#define INF 0x3f3f3f3f#define MAXD 110using namespace std;int N,M,graph[MAXD][MAXD],P,L,X,T,V,limit[MAXD],value[MAXD];int min(int a, Read More
posted @ 2012-12-19 13:29 longlongago Views(111) Comments(0) Diggs(0) Edit