博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)
阅读量:4544 次
发布时间:2019-06-08

本文共 1661 字,大约阅读时间需要 5 分钟。

题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多。

  • 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以看到信息。
  • 然后SCC缩点后就形成DAG,直接记忆化搜索,d(u)搜索从u点出发开始传最多能传多少人。
  • 最后就是找答案了。
1 #include
2 #include
3 #include
4 using namespace std; 5 #define MAXN 55555 6 #define MAXM 55555 7 8 struct Edge{ 9 int u,v,next;10 }edge[MAXM];11 int NE,head[MAXN];12 void addEdge(int u,int v){13 edge[NE].u=u; edge[NE].v=v; edge[NE].next=head[u];14 head[u]=NE++;15 }16 17 int size[MAXN],bn,belong[MAXN];18 int stack[MAXN],top;19 bool instack[MAXN];20 int dn,dfn[MAXN],low[MAXN];21 void tarjan(int u){22 dfn[u]=low[u]=++dn;23 stack[++top]=u; instack[u]=1;24 for(int i=head[u]; i!=-1; i=edge[i].next){25 int v=edge[i].v;26 if(dfn[v]==0){27 tarjan(v);28 low[u]=min(low[u],low[v]);29 }else if(instack[v]){30 low[u]=min(low[u],dfn[v]);31 }32 }33 if(dfn[u]==low[u]){34 int v; ++bn;35 do{36 v=stack[top--];37 instack[v]=0;38 belong[v]=bn;39 ++size[bn];40 }while(u!=v);41 }42 }43 44 int d[MAXN];45 int dfs(int u){46 if(d[u]) return d[u];47 int res=size[u],tmp=0;48 for(int i=head[u]; i!=-1; i=edge[i].next){49 int v=edge[i].v;50 tmp=max(tmp,dfs(v));51 }52 return d[u]=res+tmp;53 }54 55 int main(){56 int t,n,a,b;57 scanf("%d",&t);58 for(int cse=1; cse<=t; ++cse){59 NE=0;60 memset(head,-1,sizeof(head));61 scanf("%d",&n);62 for(int i=0; i

 

转载于:https://www.cnblogs.com/WABoss/p/5158884.html

你可能感兴趣的文章
Mac系统配置JDK环境变量
查看>>
多项式累加
查看>>
剑指offer(18)二叉搜索树的后续遍历
查看>>
微信小程序一笔记账开发进度四
查看>>
bzoj 1070 费用流
查看>>
201671010139 徐楠 第四周总结
查看>>
JAVA链表简单实现
查看>>
[转载]T-SQL(MSSQL)语句查询执行顺序
查看>>
SignalR 行实时通信最大连接数
查看>>
开发进度6
查看>>
php方法重载
查看>>
三次握手和四次挥手(二)
查看>>
MySQL中的索引
查看>>
Android开发之手势滑动(滑动手势监听)详解
查看>>
switch
查看>>
HTTP错误code大全
查看>>
PAT Advanced Level 1043
查看>>
决策树基础
查看>>
献给程序员之如何与陌生人交谈
查看>>
C++重载运算符练习--对people类重载“= =”运算符和“=”运算符
查看>>