1. 题目来源:2020华为软件精英挑战赛–初赛
  2. 题目说明:
    2.1 输入信息:输入为包含资金流水的文本文件,每一行代表一次资金交易记录,包含本端账号ID, 对端账号ID, 转账金额,用逗号隔开。
    本端账号ID和对端账号ID为一个32位的无符号整数
    转账金额为一个32位的无符号整数
    转账记录最多为28万条
    每个账号平均转账记录数< 10
    账号A给账号B最多转账一次
    举例如下,其中第一行[1,2,100]表示ID为1的账户给ID为2的账户转账100元:
    1,2,100
    1,3,100
    2,4,90
    3,4,50
    4,1,95
    2,5,95
    5,4,90
    4,6,30
    6,7,29
    7,4,28
    2.2 输出信息:输出信息为一个文件,包含如下信息:
    第一行输出:满足限制条件下的循环转账个数。
    说明:数据集经过处理,会保证满足条件的循环转账个数小于300万。
    第二行开始:输出所有满足限制条件的循环转账路径详情。
    输出循环转账路径要按照指定排序策略进行排序:每条循环转账中,ID(ID转为无符号整数后)最小的第一个输出;总体按照循环转账路径长度升序排序;同一级别的路径长度下循环转账账号ID序列,按照字典序(ID转为无符号整数后)升序排序。
    举例如下:
    4
    1,2,4
    1,3,4
    4,6,7
    1,2,5,4
    2.3 限制条件:循环转账的路径长度最小为3(包含3)最大为7(包含7),例如账户A给账户B转账,账户B给账户A转账,循环转账的路径长度为2,不满足循环转账条件。
  3. 题目理解:

    说明:2,4,1,2 是长度为 3 的环,按照升序的要求是:1,2,4
    本案例是以邻接表的形式找环,利用 sort 对 graph.keys() 得到的 key 值进行从小到大的排序,为了在找环过程中出现重复找环的情况,进行了剪枝优化,即:比自己小的 key 不再去查找,本案例用的最基本的 for 循环,对于十万以内的环查找速度较快,但是不建议用python 程序参加比赛,主要是太慢了。当然自己也想过用多进程多线程进行优化,然而效果并没有多大的提升,本文可以很好的帮助小白理解操作,大佬不喜勿喷啊,毕竟作为一个妹子码代码不容易,自己一个人走了太多的弯路了,不过个人很欢迎大佬前来指导一二。
    废话不多说,下面上代码。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/4/23 13:04
# @Author  : xueli
# @Software: win10 Tensorflow1.13.1 python3.6.3
import timedef func(graph,s):#graph图  s指的是开始结点path =[]for x1 in graph[s]:if x1 > s:try:nodes2 = graph[x1]except KeyError as e:passelse:for x2 in nodes2:if x2 > s:try:nodes3 = graph[x2]except KeyError as e:passelse:for x3 in nodes3:if s == x3:A = [s,x1,x2]if len(set(A)) == len(A):path.append(A)elif x3 > s:try:nodes4 = graph[x3]except KeyError as e:passelse:for x4 in nodes4:if s == x4:A = [s,x1,x2,x3]if len(set(A)) == len(A):path.append(A)elif x4 > s:try:nodes5 = graph[x4]except KeyError as e:passelse:for x5 in nodes5:if s == x5:A = [s,x1,x2,x3,x4]if len(set(A)) == len(A):path.append(A)elif x5 > s:try:nodes6 = graph[x5]except KeyError as e:passelse:for x6 in nodes6:if s == x6:A = [s,x1,x2,x3,x4,x5]if len(set(A)) == len(A):path.append(A)elif x6 > s:try:nodes7 = graph[x6]except KeyError as e:passelse:for x7 in nodes7:if s == x7:A = [s,x1,x2,x3,x4,x5,x6]if len(set(A)) == len(A):path.append(A)else:breakreturn pathdef savePredict(AA2):t2 = time.time()with open(result_name, 'w') as f:f.write(str(len(dd))+'\n')for aa in AA2:ww = str(aa)q1 = ww.strip(']')qq = q1.strip('[')bb = qq.replace(" ", "")f.write(str(bb)+"\n")print('write_time', time.time() - t2)
if __name__ == '__main__':t1 = time.time()file_name = "./data/test_data.txt"result_name = "result.txt"with open(file_name) as f:a = []c = []for line in f.readlines():line = line.strip('\n')  # 去掉换行符\nb = line.split(',')  # 将每一行以空格为分隔符转换成列表a.append(int(b[0]))c.append(int(b[1]))print('read_time', time.time() - t1)graph = {}data_list = [a,c]for x in range(len(a)):if a[x] in graph:graph[a[x]] += [c[x]]else:graph[a[x]] = [c[x]]s = sorted(graph.keys())t4 = time.time()dd = []for i in s:d = func(graph, i)if d != []:for ii in d:dd.append(ii)dd.sort()print('func_time', time.time() - t4)AA2 = sorted(dd, key=lambda i: len(i), reverse=False)print(len(dd))savePredict(AA2)print('总时:', time.time() - t1)

运行结果:

代码和数据已经上传到GitHub,感兴趣的可以下载下来。
https://github.com/xueli-lxl/python

实例:python 实现有向图找环(反洗钱、资金流)相关推荐

  1. 2020华为软件精英挑战赛-有向图找环

    初赛找环,复赛还是找环.初赛没有用到权重(金额),复赛对数据进行加强,同时对相邻两次转账的金额做了限制. 初赛用的单线程,最好成绩:0.2854, 进入了32强.复赛用了多线程,A榜最好成绩:6.11 ...

  2. codefores741A Arpa's loud Owf and Mehrdad's evil plan(图找环)

    题意: 对于给定的一个数列a[n],如果现在点i,那么下一个点就在a[i],现在问给定n个点,找到一个最小的t,使得对于从任意一个点x出发,经过t次之后,到达的点y, 使得点y经过t次之后会回到点x. ...

  3. CodeForces - 1335F Robots on a Grid(拓扑找环+反向dfs/倍增)

    题目链接:点击查看 题目大意:给出一个 n * m 的矩阵,矩阵的每一个格子都有一个颜色,颜色非黑即白,除此之外每个格子还有一个指令,分别为: ' U ':向上一个单位 ' D ':向下一个单位 ' ...

  4. Mr. Kitayuta‘s Technology CodeForces - 505D(并查集+拓扑排序或dfs找环) 题解

    题目  Shuseki Kingdom is the world's leading nation for innovation and technology. There are n cities ...

  5. Python做风险控制|找出形成环状投资的公司

    大家好,我是小小明. 今天我将带大家利用python找到关系数据的环.先说下需求和背景: 需求描述 某投资机构需要考虑各公司的投资风险,手上一份各公司投资方向的数据,主要字段是投资者和被投资者. 而有 ...

  6. python课堂实例,Python电子教案2 1 Python程序实例解析课堂

    <Python电子教案2 1 Python程序实例解析课堂>由会员分享,可在线阅读,更多相关<Python电子教案2 1 Python程序实例解析课堂(41页珍藏版)>请在人人 ...

  7. pythonsuper多重继承_python多重继承实例 python多重继承下super问题

    python的多重继承问题有些事,有些人,有些风景,一旦入眼入心,即便刹那,也是永恒.当生活心怀歹毒地将一切都搞成了黑色幽默,小编顺水推舟把自己变成了一个受过高等教育的流氓. 楼上的回答的很正确,简单 ...

  8. linux rpm找不到命令_linux环境下 python环境import找不到自定义的模块

    linux环境下 python环境import找不到自定义的模块 问题现象: Linux环境中自定义的模块swport,import swport 出错.swport模块在/root/sw/目录下. ...

  9. 没学过python、但是还是有公司要-扎心!“我学了半年 Python,还是找不到工作”...

    在编程界,Python是一种神奇的存在.有人认为,只有用Python才能优雅写代码,提高代码效率:但另一部分人恨不能把Python喷成筛子.那么,Python到底有没有用,为什么用Python找不到工 ...

  10. python多久学会自学-零基础自学Python多久可以找工作?

    零基础自学Python多久可以找工作?零基础自学3个月很难找到工作.如果全职学习Python的话,学习6个的时间,不一定能达到找到工作的水平,掌握项目经验还需要更久,达到企业需要的岗位要求还需要多练习 ...

最新文章

  1. Java开源项目整理
  2. [python] 使用scikit-learn工具计算文本TF-IDF值
  3. 我的前端成长之路:中医药大学毕业的业务女前端修炼之路
  4. python学习中文第五版_前5个学习Python的网站
  5. 软通动力华为java机考题库_华为机考笔试刷题-java-1
  6. mysql linux64安装----转载
  7. oracle安全性规则,[ORACLE ]安全性
  8. image控件的 PostBackUrl绑定Eval
  9. 基于机器学习和TFIDF的情感分类算法,详解自然语言处理
  10. 任丽萍跟我赌200块钱的
  11. 基于深度学习(端到端)的OCR文字识别
  12. Windows 7 测试体验
  13. SqlAlchemy操作(一)
  14. Ceph Cache tier配置
  15. 计算机天空之城音乐谱,天谕手游天空之城乐谱代码是什么
  16. ipone 手机不断出现电亡事件 是抹黑 还是真的如此
  17. UVa 10015 - Joseph's Cousin
  18. java上传文件夹文件
  19. gateway oauth2 对称加密_深入理解Spring Cloud Security OAuth2及JWT
  20. android 实现微信分享

热门文章

  1. matlab 液压控制系统设计,基于MATLAB的液压系统的设计与仿真
  2. 【HEVC学习与研究】46、HEVC参考代码中SAO的实现
  3. jboss下载及安装
  4. Vim开发RubyOnRails 环境打造
  5. CommandName 和 CommandArgument的区别
  6. 在Maya和ZBrush中制作战士模型
  7. 记录成功通过CSP接口获取Ukey的X509数字证书过程
  8. Android——启动本地QQ,实现与指定的QQ号临时会话
  9. windows10鼠标指针_如何在Windows 10中更轻松地查看鼠标指针
  10. linux文本编辑器vi保存命令,linux命令vi文本编辑器的使用方法