随笔分类 -  ACM

上一页 1 ··· 7 8 9 10 11 12 13 14 下一页
摘要:最短路裸题啊,顶点数较多开不了邻接矩阵的,而且边数相对较少,稀疏图,用邻接表,写了个spfa和一个优先队列的dij,当做练手spfa#include <cstdio>#include <cstring>#include <queue>using namespace std;#define N 20010#define M 50010*2#define INF 0x3f3f3f3fstruct edge{ int u,v,w,next; }e[M];int first[N],d[N],vis[N];int n,m,s,t;void spfa(){ queue 阅读全文
posted @ 2012-12-10 20:17 Titanium 阅读(587) 评论(0) 推荐(0)
摘要:题意:固定起点1和终点n,从1到n,再从n回到1,去和回的路上相同的边只能用一次,求两次的和最短,如果去的时候不能去到终点或者回的时候回不到起点那么就输出Back to jail,否则输出两次和的最小值(此图是无向图,不会有重边,边的权值在大于1小于1000)两种理解一种思路是最小费用最大流另一种是最短路不唯一且两条或者多条最短路由共用边 ,或者最短路与次短路有共用边我先写的是第二种思路,最小费用最大流还没写,明天补上,并且补上思路第二种做法是,把无向图当做有向图处理,拆成两条边,先从1到n做一次最短路,并且要记录这条有向路径。最短路结束后,记录下最短路的值d[t],如果为d[t]=INF(t 阅读全文
posted @ 2012-12-09 23:51 Titanium 阅读(1048) 评论(0) 推荐(0)
摘要:DP(仿照Floyd)uva 10048 Audiophobia 一样的题目啊这次是要找s到t的所有路径中,最小边的最大值,还是仿照Floyd,不过状态转移方程改一下,而且建图初始化也改一下就可以了(题目说了每条边的权都大于1)建图邻接矩阵初始化为,d[i][j]=g[i][j],不存在的边用0表示状态转移方程d[i][j]=min( d[i][j] , max(d[i][k] , d[k][j]) );题目有一个很隐晦的地方就是,每次送旅客过去,导游也是要过去的(然后他自己再回来),所以没一趟导游都占了一个位置,如果大家觉得sample不对的话,那就是一个小问题了#include <c 阅读全文
posted @ 2012-12-09 19:44 Titanium 阅读(480) 评论(0) 推荐(0)
摘要:DP(仿照Floyd)题意:一个无向图,然后多个查询,查询是起点和终点s和t,s到t可能有多条路径,那么每条路径都会有一条权值最大的边,在所有的最大边中找一个最小的,如果s到t之间不连通,那么输出no path想了很久,大概有两个小时的样子…………然后看了一下数据,刚好最多有100个点,最多10000个查询,那么就给了一个很大的启发,会不会有一个算法会好像dij一样,运行一次能得到做个答案,或者一个算法好像floyd一样,运行一次可以知道所有答案,出于数据的特殊性,我更倾向于往floyd的方向想。floyd的本质是DP,其实这个问题也很容易发现就是个DP,状态转移方程为max=MAX{ d[i 阅读全文
posted @ 2012-12-08 23:08 Titanium 阅读(358) 评论(0) 推荐(0)
摘要:最小生成树和这道题是一样的,不过就是给出的数据不同hdu 1879 继续畅通工程说来惭愧,写hdu那个的时候是1Y的,但是写这个却WA了一次是因为整个做法想错了WA的想法是先用邻接矩阵建图,然后用一个had数组记录已经存在的边,在计算MST最小权值的时候如果是已有的边就不用算费用,所以需要adj数组去记录 边的信息但是这个方法显然是错的,因为MST不是唯一的,如果最后MST的总权值最小,但是可能不同的MST用到的已有的边的条数是不同,用到的已有的边最少,那么需要额外付的费用就越好,如果是上面那样做,显然是WA正确的做法就是把已有的边的权值赋值为0或者一个负数都可以(最好是0,那么就不用判断是否 阅读全文
posted @ 2012-12-08 00:17 Titanium 阅读(416) 评论(0) 推荐(0)
摘要:最小生成树#include <cstdio>#include <cstring>#include <cmath>#define INF 1000000000.0#define N 110double g[N][N],lowcost[N],x[N],y[N];int n,cov[N];double dis(int i , int j){ return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); }int main(){ int T; scanf("%d",&T); w 阅读全文
posted @ 2012-12-07 20:54 Titanium 阅读(258) 评论(0) 推荐(0)
摘要:最短路题意:有一栋楼100层,从0到99编号层数,有多部电梯(最多5部),给出每部每部电梯的速度,即上或下一层楼所用的秒数。然后每部电梯不一定在所有楼层出现,给你所有电梯可能出现的层数。给你一个目标层,要你从0层开始到目标层,问所用时间最短。在0层的时候选择做哪步电梯出发不需要时间的,但是在中间的楼层,想换电梯的时候,需要60秒这个题目看完就可以想到是最短路,每层楼是1个顶点,一共100个点,然后对于楼层而言可以通过电梯到达的话就是有一条边,权值就是时间,那么可能出现平行边,比如1号电梯可以从10楼到20楼,用时200秒,2号电梯也可以从10到20楼用时100秒……………………这题,一开始没想 阅读全文
posted @ 2012-12-07 13:28 Titanium 阅读(553) 评论(0) 推荐(0)
摘要:最大流水题题意:给n个点从1到n标号,每个点有一个限制值a[i],表示从这个点流出的流量的最大值,就算有超过a[i]的流量流进i点,最后也只有a[i]流量从i点流出。然后每条有向边也有容量cap[u][v]然后给你一个源点0,它会和一些顶点相连,这些边的容量是无穷大的,然后给你一个汇点n+1,也会和一些顶点相连,这些边的容量也是无穷大的,然后求源点到汇点的最大流想了一下,有思路,无非是处理一下边的容量,起初想是对于有向边 u---->v cap[u][v]=min( cap[u][v] , a[u]); 处理完就直接最大流模板上去,过了sample,提交WA,后来才想到是cap[u][v 阅读全文
posted @ 2012-11-30 22:50 Titanium 阅读(544) 评论(1) 推荐(0)
摘要:这个题目,做之前不知道什么事差束约分,看完题目上床睡觉,想了半个小时,想到了要判断一个有向图有没有负环。第二天起来再想,觉得是判断有没有环(包括负环,正环,0环),但是不确定,要真的是这样的话,要权值来干什么,直接拓扑排序就好了,然后不确定,找了解题报告瞄一下,个个都是差束约分,然后没看其他内容,直接去学差束约分,看算法导论和网上的资料看了一个小时,懂了,就写,其实就是差束约分的模板题说说思路和题目:给你一个长度为n的序列,从下标1到n标号,然后给你m个连续的子序列,让你求和,和要大于或者小于给定的k,如果这m个不等式都能成立,就输出成功,只要有一个不成立就输出不成立。sample中第一个就是 阅读全文
posted @ 2012-11-29 19:13 Titanium 阅读(728) 评论(0) 推荐(0)
摘要:最小费用最大流:无向图(所以必须用邻接表)+当流量为D时的最小费用(即限制流量在D,求最大流)题意:就是给你一个无向图,给出所有的无向边和它们的单位费用(题中说了不会有平行边),然后给出D,K,K是指每条无向边的容量固定为K,然后问当流量为D时最小费用是多少,如果流量无法得到D这个数值,那么就输出Impossible. 解决这个问题的方法就是限制流量,加一个新的源点(或者汇点,道理一样),增加一条有向边,就是新的源点指向原本的源点,这条有向边的容量就是D,费用是0,然后求新源点到汇点的最小费用最大流,可以知道,求出来的最大流一定是小于等于D的(同样是最大水流取决于最细水管的道理,水流必须从新的 阅读全文
posted @ 2012-11-28 23:28 Titanium 阅读(695) 评论(0) 推荐(0)
摘要:二分图判定+最大匹配(匈牙利算法)解答看 hrbeu 哈工程The Accomodation of Students 阅读全文
posted @ 2012-11-26 23:47 Titanium 阅读(134) 评论(0) 推荐(0)
摘要:经典题目,HDU上也有,给定一个无向图,先判断是否为二分图,不是输出No,是的话,输出最大匹配,算是一个模板题1.一个图不存在奇环则是二分图2.二分图最大匹配用匈牙利算法#include <cstdio>#include <cstring>#define N 210int g[N][N]; //无向图领接表int mat[N],cov[N],vis[N],c[N];int n,m;void input(){ memset(g,0,sizeof(g)); for(int i=1; i<=m; i++) { int u,v; scanf("%d%d" 阅读全文
posted @ 2012-11-26 23:45 Titanium 阅读(280) 评论(0) 推荐(0)
摘要:题意:就6种型号的衣服,然后给你n件衣服,n一定是6的倍数,也就是每种类型的衣服的件数是一样的,然后给m个人,每个人能穿两种型号的衣服,给你每个人穿衣的信息,然后判断是否每个人都能找到衣服穿很显然是二分图最大匹配,但是这里有个小问题,就是一种衣服有多件,可能被多个人穿,和二分图匹配有点不同,在最大匹配中每个点是只会出现一次的,这个问题要解决不难就是把相同的衣服拆成多件不同的衣服处理,但是建图的时候就要注意多处理一下,建图完毕后就是纯粹的匈牙利算法//问题一看就是二分图匹配,不过一个种衣服会有多件要怎么处理呢,就把多件相同类型的衣服当做不同衣服来处理//衣服按照1到6编号,如果第i种衣服有重复的 阅读全文
posted @ 2012-11-26 22:42 Titanium 阅读(595) 评论(0) 推荐(0)
摘要:题意:给你n个城市的坐标,任意两个城市都是有通路的(无向的)要你算出所有点之间最短路(显然就是Floyd),然后要满足一个条件,任意两点的直接连线不能大于10,所以我们在建图的时候要算出任意两点的直接相连距离,如果有的大于10,我们将它变为INF,相当于这两点间是没有通路的。做完这个处理后就是直接的Floyd输出的意思是,要保证任意两点间都是连通的(也就是任意两点的最短路都不是INF,因为没有通路的话最后最短路会为INF),如果不能满足的话就输出失败如果能满足,也就是所有两点间的最短路都知道,那么找到最大的那个,输出,保留四位小数水题啊水题啊水题啊!!!!!!…………………………题目给的那个公 阅读全文
posted @ 2012-11-24 22:51 Titanium 阅读(346) 评论(0) 推荐(0)
摘要:算是模板题,给定一个有向图,顶点从0到n-1编号,必须从0开始出发,问是否存在负环一开始写了一个Bellman-Ford,超时,然后就放弃了,写了个spfa的bfs版本,过了,然后又写了一个spfa的dfs版本,wa,然后改了一个下午,还是wa然后上网找了一下代码,发现很多人写的都是BF算法,看了一下自己的一样,怎么会超时呢??后来才发现,我读错题意了,我本来是理解为只要图中有负环就好了,所有枚举了所有的顶点作为源点去BF,所以才超时,现在是规定了0作为源点,所以就AC了然后就把spfa的dfs版本改了一下,不要枚举所有源点,规定0为源点,然后就AC了,再修改了一些细节地方,跑出了最好成绩0. 阅读全文
posted @ 2012-11-24 19:51 Titanium 阅读(620) 评论(0) 推荐(0)
摘要://用中国剩余定理解决韩信点兵问题#include <stdio.h>long long max,x,m[8],b[8],M[8],n,N;int p[8];int main(){ int i,j,k; for(n=1,i=0; i<8; i++) {scanf("%lld",&m[i]); n=n*m[i];} //读入除数数组,注意n,为所以除数的乘积 /***************检验n和m[]数组***************/ //printf("%lld\n",n); //for(i=0; i<8; i++) 阅读全文
posted @ 2012-11-23 19:24 Titanium 阅读(592) 评论(3) 推荐(0)
摘要:并查集裸题,可以用来学习并查集的性质1.并查集判断是否成环,如果一条边的两个点的祖先相同,那么成环2.整个祖先数组中p[i]=i个个数就是连通分量的个数题目要求:1.若没哟普任何边直接输入0 0 要输出Yes2.若成环,No3.不管是否成环,图不连通,No4.注意输入中的点是任意的,编号并不连续,所以要标记哪些点出现在输入中,没有出现在输入中的点不要管#include <cstdio>#include <cstring>#define N 100010int p[N],use[N];int find(int x){ while(x!=p[x]) x=p[x]; ret. 阅读全文
posted @ 2012-11-23 17:55 Titanium 阅读(169) 评论(0) 推荐(0)
摘要:纯粹考察并查集,算是一个经典问题;统计一个集合中有多少个元素,然后找到元素个数最多的集合就普通的并查集,就能过了然后另外写了压缩路径,没想到时间没有改变然后再写一个,时间还是没有改变,好吧……………………只要懂基本的并查集的话,代码都不成问题,很裸的并查集而已代码一:纯粹#include <cstdio>#include <cstring>#define N 30000int p[N],c[N];int n,m;int find(int x){ return p[x]==x ? x : p[x]=find(p[x]); }int main(){ int T; scanf 阅读全文
posted @ 2012-11-23 16:22 Titanium 阅读(447) 评论(0) 推荐(0)
摘要:最大流裸题,有向图,然后又重边,容量要累加,这里是用BFS来做的#include <cstdio>#include <cstring>#include <queue>using namespace std;#define INF 0x3f3f3f3f#define N 20queue<int>q;int f[N][N],c[N][N],a[N],p[N],flow;int n,m;//源点和汇点分别规定为1,nvoid BFS(){ flow=0; while(1) { memset(a,0,sizeof(a)); a[1]=INF; ... 阅读全文
posted @ 2012-11-22 23:10 Titanium 阅读(206) 评论(0) 推荐(0)
摘要:最大流裸题,不过要注意建图,有重边,容量要累加,然后是无向图,就当做是有两条方向相反的有向边处理即可,详细看读取数据建图部分然后就是按照白书上面的最大流模板(BFS)来做#include <cstdio>#include <cstring>#include <queue>using namespace std;#define INF 0x3f3f3f3f#define N 110int f[N][N],c[N][N],a[N],p[N];//a数组是一个递推数组,p相当于记录路径int n,m,s,t,flow;queue <int> q;voi 阅读全文
posted @ 2012-11-22 22:25 Titanium 阅读(821) 评论(0) 推荐(0)

上一页 1 ··· 7 8 9 10 11 12 13 14 下一页