Taran 缩点【bzoj1529】[POI2005]ska Piggy banks
生活随笔
收集整理的這篇文章主要介紹了
Taran 缩点【bzoj1529】[POI2005]ska Piggy banks
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【bzoj1529】[POI2005]ska Piggy banks
Description
Byteazar 有 N 個小豬存錢罐. 每個存錢罐只能用鑰匙打開或者砸開. Byteazar 已經(jīng)把每個存錢罐的鑰匙放到了某些存錢罐里. Byteazar 現(xiàn)在想買一臺汽車于是要把所有的錢都取出來. 他想盡量少的打破存錢罐取出所有的錢,問最少要打破多少個存錢罐.
Input
第一行一個整數(shù) N (1 <= N <= 1.000.000) – 表示存錢罐的總數(shù). 接下來每行一個整數(shù),第 i+1行的整數(shù)代表第i個存錢罐的鑰匙放置的存錢罐編號.
Output
一個整數(shù)表示最少打破多少個存錢罐.
Tarjan 很簡單的題目。
但是很毒瘤地卡了空間。
首先,鑒于每個點只向外連一條有向邊,所以不要用常規(guī)存邊方式存邊,直接一個數(shù)組就可以了。
并且在縮完點之后,統(tǒng)計每個強連通分量的出度,出度為零的強聯(lián)通分量的個數(shù)即為答案。
我還整了個循環(huán)數(shù)組,卡空間是在是煩。把dfn直接當做vis用了。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int wx=1000017; inline int read(){int sum=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}return sum*f; }int n,x,col,top,ans,tot; int num; int st[wx],dfn[wx],low[wx],head[wx],belong[wx],a[wx];void Tarjan(int u){dfn[u]=low[u]=++tot;st[++top]=u;if(!dfn[a[u]]){Tarjan(a[u]);low[u]=min(low[u],low[a[u]]);}else if(!belong[a[u]]){low[u]=min(low[u],dfn[a[u]]);}if(low[u]==dfn[u]){belong[u]=++col;while(st[top]!=u){belong[st[top]]=col;top--;}top--;} } int main(){n=read();for(int i=1;i<=n;i++)a[i]=read();for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);memset(dfn,0,sizeof dfn);for(int i=1;i<=n;i++){if(belong[i]!=belong[a[i]])dfn[belong[i]]++;}for(int i=1;i<=col;i++)if(!dfn[i])ans++;printf("%d\n",ans);return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/wangxiaodai/p/9761973.html
總結(jié)
以上是生活随笔為你收集整理的Taran 缩点【bzoj1529】[POI2005]ska Piggy banks的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于jquery-Validate
- 下一篇: 数据库驱动