hdu 1827 有向图缩点看度数
题意:给一个有向图,选最少的点(同时最小价值),从这些点出发可以遍历所有。
思路:先有向图缩点,成有向树,找入度为0的点即可。
下面给出有向图缩点方法:
用一个数组SCC记录即可,重新编号,1....num,具体方法如下代码详见。
#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
using namespace std;
int n,m;
vector<vector<int> >v(10010);
int vis[10010];int dfn[10010];int low[10010];int times=0;
int num=0;
int instack[10010];stack<int>s; //有向图的连通性,用栈。
int scc[1010]; int w[1010]; int neww[1010];
int ind[1010];
void tarjarn(int u)
{
dfn[u]=low[u]=++times;
instack[u]=1;
s.push(u);
for(int i=0;i<v[u].size();i++)
{
int vv=v[u][i];
if(!vis[vv])
{
vis[vv]=1;
tarjarn(vv);
if(low[vv]<low[u])low[u]=low[vv]; //孩子可以到达,我必然也可以到达。
}
else if(instack[vv]) //注意,更新时要有在栈中条件,代表该孩子(其实是祖先)我能到达,而且是属于当前SCC。
{
if(dfn[vv]<low[u])low[u]=dfn[vv]; //能到达的祖先,所以更新。
}
}
if(dfn[u]==low[u])
{
num++;int cur;
int min=w[u]; //找这个SCC权最小的权。
do
{
cur=s.top();
if(w[cur]<min)min=w[cur];
s.pop();
instack[cur]=0;
scc[cur]=num;
}while(cur!=u);
neww[num]=min;
}
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
int ta,tb;
for(int i=0;i<=n;i++)
{
v[i].clear();
neww[i]=ind[i]=w[i]=instack[i]=dfn[i]=low[i]=vis[i]=0;
}
times=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d %d",&ta,&tb);
v[ta].push_back(tb);
}
num=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{ vis[i]=1;
tarjarn(i);
}
}
int sum=0;int count=0;
for(int i=1;i<=n;i++) //遍历边。
{
for(int j=0;j<v[i].size();j++)
{
if(scc[i]!=scc[v[i][j]])
{
ind[scc[v[i][j]]]++;
}
}
}
for(int i=1;i<=num;i++)
{
if(ind[i]==0)
{
sum+=neww[i];
count++;
}
}
printf("%d %d\n",count, sum);
}
return 0;
}
hdu 1827 有向图缩点看度数的更多相关文章
- poj 1236+hdu2767 有向图 缩点+看度数(tarjan)
1236题意:一个有向图,1,求至少从几个点出发可以遍历该图,2:,求至少添加多少边,使强连通.而,HDU的只有后面一问. 解;先缩点,第一问只需找所有入度为0的点即可.,第2问,max(入度为0的点 ...
- hdu 3072 有向图缩点成最小树形图计算最小权
题意,从0点出发,遍历所有点,遍历边时候要付出代价,在一个SCC中的边不要付费.求最小费用. 有向图缩点(无需建立新图,,n<=50000,建则超时),遍历边,若不在一个SCC中,用一个数组更新 ...
- hdu 3639 有向图缩点+建反向图+搜索
题意:给个有向图,每个人可以投票(可以投很多人,一次一票),但是一个人只能支持一人一次,支持可以传递,自己支持自己不算,被投支持最多的人. 开始想到缩点,然后搜索,问题是有一点想错了!以为支持按票数计 ...
- HDU 1827 强连通 缩点 Summer Holiday
求出强连通分量,因为强连通中只要有一个人被通知到了,所有人都能被通知到. 缩点以后形成一个DAG,找出那些入度为0的点,累加上它们的权值就是答案.一个点的权值等于SCC中权值最小的那个点. #incl ...
- HDU 4635 (完全图 和 有向图缩点)
题目链接:HDU 4635 题目大意: 给你一个有向图,加有向边,使得这个图是简单有向图.问你最多加多少条有向边. 简单有向图: 1.不存在有向重边. 2.不存在图循环.(注意是不存在 “图” 循环 ...
- Tarjan系列算法总结(hdu 1827,4612,4587,4005)
tarjan一直是我看了头大的问题,省选之前还是得好好系统的学习一下.我按照不同的算法在hdu上选题练习了一下,至少还是有了初步的认识.tarjan嘛,就是维护一个dfsnum[]和一个low[],在 ...
- HDU 1827 Summer Holiday(强连通)
HDU 1827 Summer Holiday 题目链接 题意:中文题 思路:强连通缩点,每一个点的权值为强连通中最小值,然后入度为0的点就是答案 代码: #include <cstdio> ...
- HDU1269(有向图缩点模板题)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- POJ2553( 有向图缩点)
The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9779 Accepted: ...
随机推荐
- 关于js作用域问题详解
执行上下文 函数表达式和函数声明 1. console.log(a); // ReferenceError: a is not defined // ReferenceError(引用错误)对象表明一 ...
- ubuntu 18.* 重启网卡
systemctl UNIT LOAD ACTIVE SUB DESCRIPTION proc-sys-fs-binfmt_misc.automount loaded active waiting A ...
- syslog(),closelog()与openlog()--日志操作函数 (1)
文章出处:http://blog.csdn.net/xx77009833/archive/2010/07/30/5776383.aspx 为了满足某些目的,进行日志记录是很有必要的. 在典型的 LIN ...
- LuoguP1351 联合权值 (枚举)
题目链接 枚举每个点,遍历和他相邻的点,然后答案一边更新就可以了. 最大值的时候一定是两个最大值相乘,一边遍历一边记录就好了. 时间复杂度.\(O(n)\) #include <iostream ...
- verilog behavioral modeling--blocking and nonblocking
BLOCKIN ...
- Knockout v3.4.0 中文版教程-5-计算监控-使用计算监控
3. 计算监控 1.使用计算监控 如果你有一个监控的属性firstName和另一个lastName,但你想显示全名怎么办? 这就是引入计算监控的原因-这是依赖于一个或多个其他的observables函 ...
- ubuntu介绍以及使用
Ubuntu(友帮拓.优般图.乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于Debian GNU/Linux,支持x86.amd64(即x64)和ppc架构,由全球 ...
- 【LeetCode】Linked List Cycle(环形链表)
这道题是LeetCode里的第141道题. 题目要求: 给定一个链表,判断链表中是否有环. 进阶: 你能否不使用额外空间解决此题? 简单题,但是还是得学一下这道题的做法,这道题是用双指针一个fast, ...
- Codeforces Round #415 (Div. 2) 翻车啦
A. Straight «A» time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- PTA 07-图6 旅游规划 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/717 5-9 旅游规划 (25分) 有了一张自驾旅游路线图,你会知道城市间的高速公路 ...