hdu1827Summer Holiday tarjan缩点
来源:互联网 发布:利用淘宝规则漏洞赚钱 编辑:程序博客网 时间:2024/05/22 03:22
//给一个有向图,每个点都有权值,问最少需要几个起点和最少花费多少能将整个图遍历完
//用tarjan缩点,然后找出所有入度为0的点
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std ;
const int maxn = 1010 ;
const int inf = 0x7fffffff ;
vector<int> vec[maxn] ;
int num = 0 ;
int step = 0 ;int top ;
int dfn[maxn] , low[maxn] ;
int isstack[maxn] ;
int stack[maxn] ;
int belong[maxn] ;
int value[maxn] ;
int vis[maxn] ;
int degree[maxn] ;
int mi[maxn] ;
void init()
{
num = step = top = 0 ;
memset(isstack , 0 , sizeof(isstack)) ;
memset(dfn , 0 , sizeof(dfn)) ;
memset(low , 0 , sizeof(low)) ;
memset(vis , 0 , sizeof(vis)) ;
memset(degree , 0 , sizeof(degree)) ;
for(int i = 0;i < maxn;i++)
vec[i].clear() ;
}
void tarjan(int u)
{
vis[u] = 1 ;
stack[++top] = u ;
isstack[u] = 1;
dfn[u] = low[u] = ++step ;
for(int i = 0;i < vec[u].size() ;i++)
{
int v = vec[u][i] ;
if(!dfn[v])
{
tarjan(v) ;
low[u] = min(low[u] , low[v]) ;
}
else if(isstack[v])
low[u] = min(low[u] , dfn[v]) ;
}
if(low[u] == dfn[u])
{
int v = 0 ;
num++ ;
mi[num] = inf ;
while(u!=v)
{
v = stack[top--] ;
belong[v] = num ;
mi[num] = min(mi[num] , value[v]) ;
isstack[v] = 0 ;
}
}
}
int main()
{
//freopen("in.txt" ,"r" , stdin) ;
int n , m ;
while(~scanf("%d%d" , &n , &m))
{
for(int i = 1;i <= n;i++)
scanf("%d" , &value[i]) ;
int a , b ;
init() ;
for(int i = 1;i <= m;i++)
{
scanf("%d%d" ,&a , &b) ;
vec[a].push_back(b) ;
}
for(int i = 1;i <= n;i++)
if(!vis[i])tarjan(i) ;
int sum = 0 ;
int ans = 0 ;
for(int i = 1;i <= n;i++)
{
for(int j = 0;j < vec[i].size() ;j++)
{
if(belong[vec[i][j]] != belong[i])
degree[belong[vec[i][j]]] = 1;
}
}
for(int i = 1;i <= num;i++)
if(!degree[i])
{
sum++ ;
ans += mi[i] ;
}
printf("%d %d\n" , sum , ans) ;
}
return 0 ;
}
//用tarjan缩点,然后找出所有入度为0的点
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std ;
const int maxn = 1010 ;
const int inf = 0x7fffffff ;
vector<int> vec[maxn] ;
int num = 0 ;
int step = 0 ;int top ;
int dfn[maxn] , low[maxn] ;
int isstack[maxn] ;
int stack[maxn] ;
int belong[maxn] ;
int value[maxn] ;
int vis[maxn] ;
int degree[maxn] ;
int mi[maxn] ;
void init()
{
num = step = top = 0 ;
memset(isstack , 0 , sizeof(isstack)) ;
memset(dfn , 0 , sizeof(dfn)) ;
memset(low , 0 , sizeof(low)) ;
memset(vis , 0 , sizeof(vis)) ;
memset(degree , 0 , sizeof(degree)) ;
for(int i = 0;i < maxn;i++)
vec[i].clear() ;
}
void tarjan(int u)
{
vis[u] = 1 ;
stack[++top] = u ;
isstack[u] = 1;
dfn[u] = low[u] = ++step ;
for(int i = 0;i < vec[u].size() ;i++)
{
int v = vec[u][i] ;
if(!dfn[v])
{
tarjan(v) ;
low[u] = min(low[u] , low[v]) ;
}
else if(isstack[v])
low[u] = min(low[u] , dfn[v]) ;
}
if(low[u] == dfn[u])
{
int v = 0 ;
num++ ;
mi[num] = inf ;
while(u!=v)
{
v = stack[top--] ;
belong[v] = num ;
mi[num] = min(mi[num] , value[v]) ;
isstack[v] = 0 ;
}
}
}
int main()
{
//freopen("in.txt" ,"r" , stdin) ;
int n , m ;
while(~scanf("%d%d" , &n , &m))
{
for(int i = 1;i <= n;i++)
scanf("%d" , &value[i]) ;
int a , b ;
init() ;
for(int i = 1;i <= m;i++)
{
scanf("%d%d" ,&a , &b) ;
vec[a].push_back(b) ;
}
for(int i = 1;i <= n;i++)
if(!vis[i])tarjan(i) ;
int sum = 0 ;
int ans = 0 ;
for(int i = 1;i <= n;i++)
{
for(int j = 0;j < vec[i].size() ;j++)
{
if(belong[vec[i][j]] != belong[i])
degree[belong[vec[i][j]]] = 1;
}
}
for(int i = 1;i <= num;i++)
if(!degree[i])
{
sum++ ;
ans += mi[i] ;
}
printf("%d %d\n" , sum , ans) ;
}
return 0 ;
}
0 0
- hdu1827Summer Holiday tarjan缩点
- HDU1827Summer Holiday (强连通,缩点,最小费用)
- hdu1827Summer Holiday
- hdu1827Summer Holiday【tarjan强连通分量解决最小联系费用】
- hdu 1827 Summer Holiday tarjan+缩点
- hdu1827 Summer Holiday(tarjan+ 缩点)
- 【HDU1827】Summer Holiday(Tarjan缩点)
- hdu 1827 Summer Holiday【Tarjan缩点】
- HDU1827 Summer Holiday 强连通 Tarjan 缩点 统计
- HDU 1827 Summer Holiday(Tarjan缩点)
- [HDU1827]Summer Holiday(Tarjan缩点+强连通分量)
- hdu1827 Summer Holiday(Tarjan缩点+贪心)
- HDOJ 1827 - Summer Holiday 简单的tarjan求强联通分量+缩点
- HDU ACM 1827 Summer Holiday->强连通分量+缩点(tarjan算法)
- HDU 1827 - Summer Holiday(Tarjan + 缩点 + 计算入度)
- hdu 1827 Summer Holiday Tarjan缩点+度数判断 解题报告
- HDU1827 Summer Holiday 解题报告【tarjan/强连通分量+缩点】
- hdoj1827Summer Holiday【scc+缩点】
- android studio编程时出现的错误:ListView重新载入后,更新数据或者再次进入该ListView加载数据,数据不显示 解决方法
- 软件安装基础
- tomcat7.0 内存配置
- java基础-集合遍历输出的四种方式
- Java开发之设计模式--单例模式(Singleton Pattern)
- hdu1827Summer Holiday tarjan缩点
- [常见错误 及 解决方案系列]USE " cc.exports.* = value " INSTEAD OF SET GLOBAL VARIABLE"
- Java 初始化顺序
- 第十六周阅读项目(1)
- 我的设计模式--1--单例模式
- 【poj1741】【Tree】
- 面试题23从上往下打印二叉树
- get请求 post请求
- Frame与JFrame的区别