初赛找环,复赛还是找环。初赛没有用到权重(金额),复赛对数据进行加强,同时对相邻两次转账的金额做了限制。

初赛用的单线程,最好成绩:0.2854, 进入了32强。复赛用了多线程,A榜最好成绩:6.1117。多线程负载均衡搞得很差,后面要多学习学习。

初赛最开始用的python,太耗时间了,根本没有办法比赛。这个比赛对于python 和 java选手是不太友好的。初赛后期就转为C++了,刚好可以学习一下C++。

第一次参加这种类型的比赛,总体的感受是收获很多,每天都能学到新的知识。之前没有学过数据结构,这次算是学到了点皮毛。之前写代码,耗时差不多就行,这次算是开了眼,前排大佬们各种骚操作。初赛最后,大佬们直接把线上数据集刺探透了,整个排行榜开始严重内卷。复赛初期,由于线上数据集太弱,又开始卷了。好在官方接受了选手们的意见,增强了数据集。

贴一下初赛的代码,复赛太长了就不贴了。

//
// Created by root on 4/10/20.
//
#include <bits/stdc++.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
using namespace std;
//#define  TESTstruct  Edge
{int ida;int idb;
//    int money;
};struct Slice {int* arr;int  n;int* begin() { return arr; }int* end() { return arr + n; }
};#define edgesnum 280000
#define nodenum 280000int feats[edgesnum][3]={0};//保存输入的边,起点id,终点id, 金额
int featscnt=0;int nodeidmax = 0;
int graph[nodenum][50]={0}; //保存图,图的出度小于50
int graph_size[nodenum]={0};//保存每个点的出度数量 int graphR[nodenum][50]={0};//保存反向图,图的入度小于50
int graphR_size[nodenum]={0};//保存每个点的入度数量 char CID[nodenum][8]={"\0"};
char *(CIDpt[nodenum])={NULL};int nodetoi[nodenum][50]={0}; // 保存以点j为起点,经过 k到达 i的路径。只用保存k就可以。
int nodetoi_size[nodenum]={0};int res_cnt[8] = {0,0,0,0,0,0,0,0};
int res3[1000000][3]={0};//保存环3的结果
int res4[1000000][4]={0};
int res5[1000000][5]={0};
int res6[2000000][6]={0};
int res7[3000000][7]={0};//保存环7的结果 char buf[200000000];//保存最后要写入文件的内容 inline int fast_atoi( const char * str )
{/*将字符串变成整型数*/ int val = 0;while( *str!=',' ) {val = val*10 + (*str++ - '0');}return val;
}void load_testdata(string &test_dataf) { char *buf;int test_data_size = 0;int fd = open(test_dataf.c_str(), O_RDONLY);test_data_size = lseek(fd, 0, SEEK_END);buf = (char*)mmap(NULL, test_data_size, PROT_READ, MAP_PRIVATE, fd, 0);char *p = buf;int temp1 = 0,temp2 = 0;while((p-buf) < test_data_size) {temp1 = fast_atoi(p);while (*p != ',') // 其实这里可以fast_atoi放进来展开写,那样就舍去了下面的p++操作。但是改完发现变慢了一点,玄学了。 p++;p++;temp2 = fast_atoi(p);while (*p != ',')p++;p++;while (*p != '\n')// 由于不需要金额,就略过了。 p++;p++;feats[featscnt][0]=temp1;feats[featscnt][1]=temp2;featscnt+=1;}
}void build_graph()
{/*建立正向图和反向图, 并对度数大于1的进行排序, 同时保存每个id的字符串*/ for(int i=0; i<featscnt; ++i){graph[feats[i][0]][graph_size[feats[i][0]]] = feats[i][1];++graph_size[feats[i][0]];graphR[feats[i][1]][graphR_size[feats[i][1]]] = feats[i][0];++graphR_size[feats[i][1]];}#ifdef TESTint notemptycount1=0;for (int i=0; i< nodenum; ++i){if (graph_size[i]>0 )notemptycount1+=1;}#endiffor (int i=0; i< nodenum; ++i){if (graph_size[i]>0) {nodeidmax = i;sprintf(CID[i], "%d", i);CIDpt[i] = CID[i];if (graph_size[i] > 1) {sort(graph[i], graph[i] + graph_size[i]);}}}for (int i=0; i< nodenum; ++i) {if (graphR_size[i] > 1) {sort(graphR[i], graphR[i] + graphR_size[i]);}}#ifdef TEST//int notemptycount2=0;for (int i=0; i< nodenum; ++i){if (graph_size[i]>0)notemptycount2+=1;}cout<<  "graph size(topobefore):" << notemptycount1 << " graph size(topoafter):" << notemptycount2 << endl;#endif
}void res_fromgraph()
{/*开始找环, 对于每个起点i,先反向找2步,并且记录反向第3个点中能够到达i的点;再正向4步*//*每次对于小于i的直接剪掉,因为题目要求每个环的起点id要最小*/
//    NodePath nodepath;int pathtemp[7] = {0};bool vist[nodenum]={false};vector<int> glrecord;vector<bool> nodetoi_jumptwo_flag(nodenum, false);//jump two nodevector<int> gjrecord;vector<bool> nodetoi_flag(nodenum, false);//jump one nodeint i = 0;int loopnum = nodeidmax + 1;for (; i<loopnum; ++i){    if(graph_size[i] < 1)continue;if(graphR_size[i] < 1)continue;for(auto &gjr:gjrecord){nodetoi_size[gjr] = 0; //from j to i nunber equals zeronodetoi_flag[gjr] = false;}for(auto &glr:glrecord){ nodetoi_jumptwo_flag[glr] = false;}gjrecord.clear();glrecord.clear();for(auto &gk:Slice{graphR[i], graphR_size[i]}){   if (gk < i)continue;for (auto &gj:Slice{graphR[gk], graphR_size[gk]}){if (gj>i) {nodetoi[gj][nodetoi_size[gj]] = gk;++nodetoi_size[gj];nodetoi_flag[gj] = true;gjrecord.push_back(gj);for(auto &gl:Slice{graphR[gj], graphR_size[gj]}){if (gl>i and gl!=gk){  nodetoi_jumptwo_flag[gl] = true;glrecord.push_back(gl);}}}}}vist[i] = true;pathtemp[0] = i;for(auto &node_j2: Slice{graph[i], graph_size[i]}){if (node_j2 < i)continue;vist[node_j2] = true;pathtemp[1] = node_j2;for (auto &node_j3:Slice{graph[node_j2], graph_size[node_j2]}){if (node_j3 <= i)continue;vist[node_j3] = true;pathtemp[2] = node_j3;for (auto &node_j4:Slice{graph[node_j3], graph_size[node_j3]}){if (node_j4 < i)continue;if (node_j4 == i){memcpy(res3[res_cnt[3]], pathtemp, sizeof(int)*3);++res_cnt[3];continue;}if(vist[node_j4])continue;vist[node_j4] = true;pathtemp[3] = node_j4;if (nodetoi_flag[node_j4]) {for (auto &node_j4toi:Slice{nodetoi[node_j4], nodetoi_size[node_j4]}) {if (vist[node_j4toi]) {continue;}pathtemp[4] = node_j4toi;memcpy(res5[res_cnt[5]], pathtemp, sizeof(int)*5);++res_cnt[5];}}for (auto &node_j5:Slice{graph[node_j4], graph_size[node_j4]}){if (node_j5 < i)continue;if (node_j5 == i) {memcpy(res4[res_cnt[4]], pathtemp, sizeof(int)*4);++res_cnt[4];continue;}if (vist[node_j5])continue;vist[node_j5] = true;pathtemp[4] = node_j5;if (nodetoi_flag[node_j5]){for (auto &node_j5toi:Slice{nodetoi[node_j5], nodetoi_size[node_j5]}) {if (vist[node_j5toi]) {continue;}pathtemp[5] = node_j5toi;memcpy(res6[res_cnt[6]], pathtemp, 24);++res_cnt[6];}}if (!nodetoi_jumptwo_flag[node_j5]){vist[node_j5] = false;continue;}for (auto &node_j6:Slice{graph[node_j5], graph_size[node_j5]}){if (!vist[node_j6] and nodetoi_flag[node_j6]){pathtemp[5] = node_j6;for (auto &node_j6toi:Slice{nodetoi[node_j6], nodetoi_size[node_j6]}) {if (vist[node_j6toi])continue;else {pathtemp[6] = node_j6toi;memcpy(res7[res_cnt[7]], pathtemp, 28);++res_cnt[7];}}}
//                            vist[node_j6]=false;}vist[node_j5] = false;}vist[node_j4] = false;}vist[node_j3] = false;}vist[node_j2] = false;}vist[i] = false;}
}inline char* mystrcat( char* dest, char* src )
{while (*dest) dest++;while (*dest++ = *src++);return --dest;
}void save_fwrite(string &outfile){/*保存输出*/ FILE *fp = fopen(outfile.c_str(), "wb");char cntnum[50]={'\0'};char *cntnumptr = cntnum;  char *bpt=buf;int rescnt=0;char idcomma = ',';char idlf = '\n';for (int i=3; i<8;++i){rescnt += res_cnt[i];}sprintf(cntnum,"%d\n",rescnt);bpt = mystrcat(bpt, cntnumptr);int j = 0;for (j=0; j<res_cnt[3]; j++) {for (int i = 0; i < (3-1); i++) {bpt = mystrcat(bpt, (CIDpt[res3[j][i]]));*bpt++ = idcomma;}bpt = mystrcat(bpt, (CIDpt[res3[j][2]]));*bpt++ = idlf;}for (j=0; j<res_cnt[4]; j++) {for (int i = 0; i < (4-1); i++) {bpt = mystrcat(bpt, (CIDpt[res4[j][i]]));*bpt++ = idcomma;}bpt = mystrcat(bpt, (CIDpt[res4[j][3]]));*bpt++ = idlf;}for (j=0; j<res_cnt[5]; j++) {for (int i = 0; i < (5-1); i++) {bpt = mystrcat(bpt, (CIDpt[res5[j][i]]));*bpt++ = idcomma;}bpt = mystrcat(bpt, (CIDpt[res5[j][4]]));*bpt++ = idlf;}for (j=0; j<res_cnt[6]; j++) {for (int i = 0; i < (6-1); i++) {bpt = mystrcat(bpt, (CIDpt[res6[j][i]]));*bpt++ = idcomma;}bpt = mystrcat(bpt, (CIDpt[res6[j][5]]));*bpt++ = idlf;}for (j=0; j<res_cnt[7]; j++) {for (int i = 0; i < (7-1); i++) {bpt = mystrcat(bpt, (CIDpt[res7[j][i]]));*bpt++ = idcomma;}bpt = mystrcat(bpt, (CIDpt[res7[j][6]]));*bpt++ = idlf;}fwrite(buf,sizeof(char), bpt-buf, fp);fclose(fp);
}int main()
{
#ifdef TESTauto starttime=clock();
#endifstring test_data_path = "/data/test_data.txt";string outfile="/projects/student/result.txt";// load dataload_testdata(test_data_path);// build graphbuild_graph();res_fromgraph();
#ifdef TESTauto midtime = clock();
#endifsave_fwrite(outfile);#ifdef TESTcout << "res.size: " << res_cnt[3] + res_cnt[4] + res_cnt[5] + res_cnt[6] + res_cnt[7] << endl;auto endtime=clock();cout<< "cost time write: " << (midtime - starttime)<<endl;cout<< "cost time: " << (endtime - starttime)<<endl;
#endifexit(0);return 0;
}

2020华为软件精英挑战赛-有向图找环相关推荐

  1. 2020华为软件精英挑战赛总结

    2020华为软件精英挑战赛总结 00 赛题描述 01 整体思路 02 数据读取以及正反向图构建 03 多线程找环运动 031 反向DFS 3层构建P3 032 正向DFS 4层找环 04 结果输出 0 ...

  2. 2020华为软件精英挑战赛——总结

    2020华为软件精英挑战赛 github:https://github.com/jadyntao/HuaWei_CodeCraft_2020 队伍:助教小分队(粤港澳赛区) 初赛:0.2102(赛区第 ...

  3. 2020华为软件精英挑战赛历程总结——初赛篇

    前言 去年懵懵懂懂,一个人从头自闭到尾,到最后也没对上判题器,复赛第十遗憾离场.今年的开端也是十分不顺,我们提交的第一发线上14s,这时候前排已经有0.x的成绩了,一度陷入深深的自我怀疑之中.好在队友 ...

  4. 2020华为软件精英挑战赛历程总结——复赛篇

    前言 最近在打腾讯广告算法大赛,所以一直在鸽0 0,再加上复赛印象不怎么深刻,所以就随便扯啦. 开源地址:https://github.com/Chadriy/CodeCraft2020 放题 一.规 ...

  5. 2020华为软件精英挑战赛历程总结——决赛篇

    前言 决赛的过程颇为坎坷,深深的感受到了自身能力的不足,团队的力量有时要远胜个人. 开源地址:https://github.com/Chadriy/CodeCraft2020 放题 复赛结束,还没来得 ...

  6. 2020华为软件精英挑战赛历程总结

    前言 历时两个月,终于结束了今年的华为软挑,这感觉就很爆肝.非常感谢队友们的强力输出.还有遇到的的大佬.成研所的小姐姐们,虽然成绩不佳,但还是分享一下我们每个阶段的成长. 首先简单自我介绍一下,我是I ...

  7. 2017华为软件精英挑战赛小结

    // 2017华为软件精英挑战赛小结 // 不说废话,直接上货!希望对目前的参赛者,或日后学习的人,提供一些参考和思路. #include <赛题说明.pdf>    //  见附录文件 ...

  8. 2016华为软件精英挑战赛:赛题及其答疑汇总

    注:本文文字均摘自官方指定网站和论坛,权威且可信,答疑见中间部分,非常全,众玩家可放心阅读. 同时文末给出了包括自己在内的诸多玩家的解法. 前言 赛题源自"未来网络"业务发放中的路 ...

  9. 2023华为软件精英挑战赛,探寻软件人才与科技创新的最优解

    作者 | 曾响铃 文 | 响铃说 今天,软件行业正呈现出江河入海一般的大汇流趋势. 一方面是技术的汇流,诸如人工智能等前沿技术与软件行业的深度融合,正全面颠覆软件产品的开发模式和服务逻辑. 另一方面则 ...

最新文章

  1. matlab 两列数据相乘,在EXCEL中,两列完全相同的数据,求和结果不一样??单元格两列相乘的公式...
  2. python 鱼c工作室作业_鱼C工作室Python作业
  3. 深入浅出jQuery (五) 如何自定义UI-Dialog?
  4. matlab按某一列排序
  5. 2017乌鲁木齐ICPC: K. Sum of the Line(容斥)
  6. 在肉鸡上构建一个完美的虚拟主机
  7. Fiddler中文版汉化插件 0.1
  8. win7 计算机刷新dns,刷新dns,教您怎么刷新DNS
  9. 前路钉板系统在重建胸腰段稳定性中应用 [已发表]
  10. 小程序源码:拼图工具箱支持多种拼图模式制作-多玩法安装简单
  11. java代码餐馆管理系统_java版餐饮管理系统
  12. 语音芯片播报方案选型补充说明
  13. Java基础——IO流
  14. shell一键部署mysql
  15. android 8.0动态申请读写权限
  16. Java中关于length和length()的问题小结
  17. 什么叫h5项目_后端产品经理的第一次H5项目
  18. 台北淡水 渔人码头之行 1
  19. 先天性青光眼?小孩也会患青光眼?
  20. python中使用递归实现斐波那契数列

热门文章

  1. 2020年第十届C/C++ B组第二场蓝桥杯省赛真题(跑步锻炼)第4道
  2. [转] 面向对象编程 - 获取对象信息
  3. 用Python3.6操作HBase之HBase-Thrift
  4. Python查找两个word中的相同内容
  5. python实现将子文件夹下的图片复制到新的文件夹并重命名
  6. [codewars] - int32 to IPv4 二进制十进制 ip地址转换
  7. centos7 卸载 jdk
  8. android 事件机制初探
  9. Libevent 事件循环(1)
  10. codeforces 796A-D