第五届上海大学程序的设计联赛冬季赛题目分析.ppt

第五届上海大学程序的设计联赛冬季赛题目分析.ppt

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  1. 1、本文档共35页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五届上海大学程序的设计联赛冬季赛题目分析

看个例子: 1 2 4 5 3 1 2 3 4 5 1 2 3 4 5 转化 最大匹配数:3 最小覆盖路径数=5-3=2 至此,简化的问题已经解决,那么原问题怎么解决呢? 深入的思考后,我们应该可以发现,对原问题来说,两点之间的关系是能否直接或间接地到达。 于是,图的边的关系转化为一种连通关系,即图的传递闭包。我们可以通过Floyd-Warshall算法轻松解决。于是,整个问题就得以解决了。 核心代码(1)——Floyd-Warshall求传递闭包 void prework() { for(int k=0;kN;++k) for(int i=0;iN;++i) { if(i==k) continue; for(int j=0;jN;++j) { if(j==k||j==i) continue; if(G[i][k]G[k][j]) G[i][j]=1; } } for(int i=0;iN;++i) for(int j=0;jN;++j) if(G[i][j]) map[i].push_back(j); } 核心代码(2)——匈牙利算法求二分图最大匹配 int hungary() { int ret=0; memset(matx,0xff,sizeof(matx)); memset(maty,0xff,sizeof(maty)); for(int i=0;inx;++i) { if(matx[i]0) { memset(fy,0,sizeof(fy)); ret+=path(i); } } return ret; } 这道题目有相当的现实意义,在很多图形图像处理软件中,都会出现类似的操作。 题意是这样的,每次对一个星星(多边形)进行4种变换,分别为缩放(S),以源点为圆心逆时针旋转(A),平移(L)和反向(R)。 可以看出,这道题目就是一些坐标变换,我们可以手工推一下这些坐标变换的公式即可。 当然,也可以用坐标矩阵变换。 这题应该注意题意的理解。 核心代码(1)——矩阵相乘 void leftMul(Matrix other) { Matrix mtx; REP(i,3) REP(j,3){ mtx.arr[i][j] = 0.0f; REP(k,3){ mtx.arr[i][j] += other.arr[i][k] * arr[k][j]; } } REP(i,3) REP(j,3) arr[i][j] = mtx.arr[i][j]; } void rightMul(Point pt){ Point t; t.x = arr[0][0] * pt.x + arr[0][1] * pt.y + arr[0][2]; t.y = arr[1][0] * pt.x + arr[1][1] * pt.y + arr[1][2]; pt.x=t.x; pt.y=t.y; } 核心代码(2)——矩阵相乘坐标变换 switch( tran.order[k] ){ case S:mtx.arr[0][0] = tran.s; mtx.arr[1][1] = tran.s; break; case A:mtx.arr[0][0] = cos(tran.a); mtx.arr[0][1] = -1 * sin(tran.a); mtx.arr[1][0] = sin(tran.a); mtx.arr[1][1] = cos(tran.a); break; case L:mtx.arr[0][2] = tran.x; mtx.arr[1][2] = tran.y; break; case R: switch(tran.r){ case X:mtx.arr[1][1] = -1; break; case Y:mtx.arr[0][0] = -1; break; } break; } ident.leftMul(mtx); 这题叙述较繁,主要为了做广告。其实题意很简单,做下字符串比较就可以了。 如果不明白的话就多读几遍题吧~~ 核心代码 #include iostream #includestring using namespace std; int main() { string s; int n; cinn; for(int t1=0;t1n;++t1) { cins;

文档评论(0)

bokegood + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档