22.4-2简单路径条数
2016-03-31 15:51
162 查看
利用有向无环图的性质,不存在后向边,只存在树边前向边和横向边
给节点增加一个属性,即节点到目标节点的简单路径条数
考虑节点u
v是白色的,则v.count还没有计算,计算v.count,再u.count+=v.count
v是黑色的,则将u.count+=v.count,避免重复计算,因此具有动态规划性质
v不可能是灰色的
算法的复杂度和dfs相同为o(v+e)
给节点增加一个属性,即节点到目标节点的简单路径条数
考虑节点u
v是白色的,则v.count还没有计算,计算v.count,再u.count+=v.count
v是黑色的,则将u.count+=v.count,避免重复计算,因此具有动态规划性质
v不可能是灰色的
算法的复杂度和dfs相同为o(v+e)
#include<stdio.h> #include<stdlib.h> #define white 1 #define gray 2 #define black 3 typedef struct edge{ int i; struct edge *next; }edge; typedef struct node{ int d,f,color,count; edge *next; }node; typedef struct gve{ int v,e; node *g; }gve; int insert(node *pnode,int i) { edge *new; new=(edge *)malloc(sizeof(edge)); new->i=i; new->next=pnode->next; pnode->next=new; return 0; } int dfsvisit(gve G,node *pnode,int *time) { edge *tmp=pnode->next; (*time)++; pnode->d=*time; pnode->color=gray; while (tmp!=NULL) { if (G.g[tmp->i].color==white) dfsvisit(G,&G.g[tmp->i],time); pnode->count+=G.g[tmp->i].count; tmp=tmp->next; } pnode->color=black; (*time)++; pnode->f=*time; return 0; } int main(void) { int i; gve G; scanf("%d%d",&G.v,&G.e); G.g=(node *)malloc(sizeof(node)*(G.v+1)); for (i=1;i<=G.v;i++) { G.g[i].count=0; G.g[i].next=NULL; G.g[i].color=white; } int s,d; for (i=1;i<=G.e;i++) { scanf("%d%d",&s,&d); insert(&G.g[s],d); } scanf("%d%d",&s,&d); G.g[d].count=1; int time=0; dfsvisit(G,&G.g[s],&time); printf("%d\n",G.g[s].count); return 0; }
相关文章推荐
- C++STL库之algorithm库
- 仿QQ注册验证码的实现。
- 俩个float数之间比较大小
- 【追求进步】字符串的排列
- Winio64在64位系统中初始化失败问题
- Java锁之自旋锁详解
- 【OpenCV】OpenCV3的第三天——core组件
- 多线程:下载管理器(模拟 SDWebImage)
- APP Run In Background(App 的后台运行)
- Eclipse常用设置
- 笔记 AsyncTask运行原理
- xcode7.2如何真机测试iOS9.3系统
- 使用git pull文件时和本地文件冲突怎么办?
- 通过url地址获取数据后将数据利用SpringMVC的@ResponseBody返回中文可能出现乱码地方
- iOS之隐藏/显示tabbar
- 归并排序的使用
- IOS折线统计图
- 李彦宏:数据技术共享与“圈子联合文化”
- ExecutorService的几种关闭线程池方法
- ssh 无密码登陆