CDOJ 图论专题 A.不是图论 强连通分量+拓扑排序 经典
题目链接 在其中纠错第一次wa代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-;
const int inf =0x7f7f7f7f;
const double pi=acos(-);
const int maxn=; vector<int> G[maxn+],GG[maxn+];
int n,m,vlue[maxn+],pre[maxn+],deg[maxn],dfs_clock,scc_cnt,sccno[maxn+],lowlink[maxn+];
stack<int> S;
ll ori[maxn+],dp[maxn+];
ll maxx(ll a,ll b)
{
return a>b?a:b;
}
void tarjan(int u)
{
pre[u]=lowlink[u]=++dfs_clock;
S.push(u);
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(!pre[v])
{
tarjan(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}
else if(!sccno[v])
lowlink[u]=min(lowlink[u],pre[v]);
} if(lowlink[u]==pre[u])
{
scc_cnt++;
while()
{
int x=S.top();S.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
} void find_scc()
{
MM(pre,);
MM(sccno,);
scc_cnt=dfs_clock=;
for(int i=;i<=n;i++)
if(!pre[i])
tarjan(i);
}
set<int> st[maxn];
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=;i<=n;i++)
{
st[i].clear();
G[i].clear();
scanf("%d",&vlue[i]);
} for(int i=;i<=m;i++)
{
int u,v;
scanf("%d %d",&u,&v);
G[u].push_back(v);
} find_scc(); for(int i=;i<=scc_cnt;i++) {
deg[i]=dp[i]=ori[i]=;
GG[i].clear();
}
for(int i=;i<=n;i++)
ori[sccno[i]]+=vlue[i];
if(scc_cnt==) {printf("%lld\n",ori[]);continue;}//需要特判,因为ans初始化为0或者
//不特判但将ans初始化为dp[1]
for(int i=;i<=n;i++)
for(int j=;j<G[i].size();j++)
if(sccno[i]!=sccno[G[i][j]])
{
int u=sccno[i],v=sccno[G[i][j]];
if(!st[u].count(v))//set判断图的连通性
{
GG[u].push_back(v);
st[u].insert(v);
deg[v]++;
}
} ll ans=;
for(int i=;i<=scc_cnt;i++) dp[i]=ori[i]; queue<int> q;//拓扑排序是需要借助BFS的
for(int i=;i<=scc_cnt;i++)
if(!deg[i]) q.push(i); while(q.size())
{
int u=q.front();q.pop();
for(int i=;i<GG[u].size();i++)
{
int v=GG[u][i];
dp[v]=maxx(dp[v],dp[u]+ori[v]);
ans=maxx(ans,dp[v]);
deg[v]--;
if(!deg[v]) q.push(v);
}
}
printf("%lld\n",ans);
}
return ;
}
第一次wa代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-;
const int inf =0x7f7f7f7f;
const double pi=acos(-);
const int maxn=; vector<int> G[maxn+],GG[maxn+];
int n,m,vlue[maxn+],ori[maxn+],dp[maxn+],pre[maxn+],dfs_clock,scc_cnt,sccno[maxn+],lowlink[maxn+];
stack<int> S; void tarjan(int u)
{
pre[u]=lowlink[u]=++dfs_clock;
S.push(u);
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(!pre[v])
{
tarjan(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}
else if(!sccno[v])
lowlink[u]=min(lowlink[u],pre[v]);
} if(lowlink[u]==pre[u])
{
scc_cnt++;
while()
{
int x=S.top();S.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
} void find_scc()
{
MM(pre,);
MM(sccno,);
scc_cnt=dfs_clock=;
for(int i=;i<=n;i++)
if(!pre[i])
tarjan(i);
} int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=;i<=n;i++)
{
G[i].clear();
GG[i].clear();
scanf("%d",&vlue[i]);
} for(int i=;i<=m;i++)
{
int u,v;
scanf("%d %d",&u,&v);
G[u].push_back(v);
} find_scc(); for(int i=;i<=scc_cnt;i++) dp[i]=ori[i]=;
for(int i=;i<=n;i++)
ori[sccno[i]]+=vlue[i]; for(int i=;i<=n;i++)
for(int j=;j<G[i].size();j++)
if(sccno[i]!=sccno[G[i][j]])
{
int u=sccno[i],v=sccno[G[i][j]];
if(lower_bound(GG[u].begin(),GG[u].end(),v)==GG[u].end())
GG[u].push_back(v);
}
int ans=;
for(int i=;i<=scc_cnt;i++) dp[i]=ori[i];
for(int i=;i<=scc_cnt;i++)
for(int j=;j<GG[i].size();j++)
{
int v=GG[i][j];
//printf("1::%d %d %d\n",i,v,ori[i],ori[v]);
dp[v]=max(dp[v],dp[i]+ori[v]);
ans=max(ans,dp[v]);
}
printf("%d\n",ans);
}
return ;
}
CDOJ 图论专题 A.不是图论 强连通分量+拓扑排序 经典的更多相关文章
- BZOJ_3887_[Usaco2015 Jan]Grass Cownoisseur_强连通分量+拓扑排序+DP
BZOJ_3887_[Usaco2015 Jan]Grass Cownoisseur_强连通分量+拓扑排序+DP Description In an effort to better manage t ...
- BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset
BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i ...
- poj 2762(强连通分量+拓扑排序)
题目链接:http://poj.org/problem?id=2762 题意:给出一个有向图,判断任意的两个顶点(u,v)能否从u到达v,或v到达u,即单连通,输出Yes或No. 分析:对于同一个强连 ...
- BZOJ1924:[SDOI2010]所驼门王的宝藏(强连通分量,拓扑排序)
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- 2019ICPC(银川) - Delivery Route(强连通分量 + 拓扑排序 + dijkstra)
Delivery Route 题目:有n个派送点,x条双向边,y条单向边,出发点是s,双向边的权值均为正,单向边的权值可以为负数,对于单向边给出了一个限制:如果u->v成立,则v->u一定 ...
- POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)
职务地址:id=2762">POJ 2762 先缩小点.进而推断网络拓扑结构是否每个号码1(排序我是想不出来这点的. .. ).由于假如有一层为2的话,那么从此之后这两个岔路的点就不可 ...
- 图论:POJ2186-Popular Cows (求强连通分量)
Popular Cows Description Every cow's dream is to become the most popular cow in the herd. In a herd ...
- 图论相关知识(DFS、BFS、拓扑排序、最小代价生成树、最短路径)
图的存储 假设是n点m边的图: 邻接矩阵:很简单,但是遍历图的时间复杂度和空间复杂度都为n^2,不适合数据量大的情况 邻接表:略微复杂一丢丢,空间复杂度n+m,遍历图的时间复杂度为m,适用情况更广 前 ...
- POJ-2762-Going from u to v or from v to u(强连通, 拓扑排序)
链接: https://vjudge.net/problem/POJ-2762 题意: In order to make their sons brave, Jiajia and Wind take ...
随机推荐
- Linux学习笔记(16)Linux前后台进程切换(fg/bg/jobs/ctrl+z)
关键词:Linux前后台进程切换,linux进程切换 fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& ...
- 【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表
提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表.今天我们来一起了解一下什么是报表,报表的结构.构成元素,以及为什么需要报表. 什么是报表 简单的说:报表就是通过表格.图 ...
- 最大矩阵覆盖权值--(静态连续最大子段 (线段树) )-HDU(6638)Snowy Smile
这题是杭电多校2019第六场的题目 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6638 题意:给你平面上n个点,每个点都有权值(有负权),让你计算一 ...
- PHP使用CURL抓取页面
cURL的基本原理 curl是利用URL语法在命令行方式下工作的开源文件传输工具,他能够从互联网上获得各种各样的网络资源.简单来说,curl就是抓取页面的升级版. <?php //1.初始化,创 ...
- mongodb 数据操作(2)
查询 db.student.find({}) 查询db.student.find({name:"李强1"}) 查询 条件查询 db.student.find({sex:&quo ...
- Git 一般性操作
git全局设定 git config --global user.name “码云账号” git config --global user.email “码云注册邮箱” git 定位文件夹cd进入到需 ...
- JS常用自定义函数总结
JS常用自定义函数总结 1.原生JavaScript实现字符串长度截取 2.原生JavaScript获取域名主机 3.原生JavaScript清除空格 4.原生JavaScript替换全部 5.原 ...
- 多线程编程-- part5.1 互斥锁之公平锁-释放锁
释放公平锁 1.unlock() unlock()在ReentrantLock.java中实现的,源码如下: public void unlock() { sync.release(1); } 说明: ...
- 使用CXF开发WebService程序的总结(七):Spring+CXF+Mybatis+Mysql共同打造的服务端示例
通过该demo,可以 熟悉下 spring+cxf+maven+mybatis+mysql等常见后端技术整合 1. 在前面的 父工程 ws_parent 中 添加依赖 由于原来的项目是使用的cxf依赖 ...
- 三种Shell脚本编程中避免SFTP输入密码的方法
最近编程中用到sftp上传文件,且需要用crontab预设定时上传事件.而sftp不同于ftp,没有提供选项如 -i 可以将密码直接编码进程序.使用sftp指令,会自动请求用户输入密码. 总结一下可以 ...