随笔分类 - 《ACM程序设计竞赛基础教程》
摘要:经典题目,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"
阅读全文
摘要:最小生成树裸题,给出n个点的坐标,求MST的权值总和,用prim实现#include <stdio.h>#include <math.h>#include <string.h>#include <algorithm>#define INF 100000000.0#define N 110using namespace std;double x[N],y[N],dis[N][N],lowcoat[N];bool vis[N];int n;double DIS(int i , int j){ return sqrt( (x[i]-x[j])*(x[i
阅读全文
摘要:这个OJ比较折腾,中文注释什么的都要注意,本来代码是1Y的,但是因为中文注释的问题CE和TLE了无数次,把中文注释消掉一部分后就AC了,一位同学说是中文注释的换行问题,所以如果这个代码copy过去不能AC而是什么CE,TLE甚至WA的话,那不是代码的问题应该是一些细节问题,可以搞搞中文注释什么的大概就过了最短路径的变形给出有向边u->v,后面跟两个数据一个是走这条边要用的时间,之后是到达v点后会有红绿灯,每次红绿灯的时间,,一开始所有红绿灯都是从红灯开始的用dij算法来时间,具体的做法只是修改了一下dij算法的模板//判断红绿灯的方法是 当前是时间t和这个点的红绿灯时间w//(t/w)%
阅读全文
摘要:欧拉回路裸题,给定n个点和m条有向边,判断该图是否为欧拉回路有向图欧拉回路判断条件有:图连通,所有点的度为偶数代码一,用并查集来判断图是否连通,然后逐一扫描所有点的度是否为偶数#include <stdio.h>#include <string.h>#define N 110int n,m;int d[N];int p[N];int find(int x) //并查集{ return p[x]==x ? x : find(p[x]); }int main(){ int CASE,i,j,u,v,x,y,ok; scanf("%d",&CASE
阅读全文
摘要:先来骂街一下………………这个OJ太神了,搞死我了,好像一定要初始化某个数组还是怎么样,至今搞不明白,我还特意搞了很多个初始化,总之有初始化就通过,没有就得吃WA,问题是那个初始化时没有必要的……………………说说算法,就是和矩阵链乘法的DP是一模一样的,用a[N]来记录n个数字,op[N]记录操作符,下标是1到N,op[i]表示a[i]后面跟的操作符,所以op[n]是没有的,赋值为"&"做个标记;如果整个表达式都是正数的话,那么很容易处理,但是数字有些是负数,我们来考虑这种情况,表达式的两部分都是负数的话相乘为正数,有可能比只用正数求的结果还大。但是我们应该使两个负数
阅读全文
摘要://DP入门题状态转移方程很容易想到//关键是构建pre数组,多少有点像KMP里面构建的next数组#include <stdio.h>#include <string.h>#define MAX 50100int a[MAX],pre[MAX],dp[MAX];int n;int main(){ int i,j,T,max; scanf("%d",&T); while(T--) { scanf("%d",&n); pre[1]=0; dp[1]=0; ...
阅读全文