[2018.11.03 T1] 遊戲攻略

暫無鏈接

遊戲攻略

GISPZJZ 在玩一款火爆的遊戲,遊戲中有nn個技能點,編號分別爲1,2,,n1,2,…,n。有些技能 點可以直接學習,還有一些技能點需要你已經學習某些技能點,才能夠學習。一開始 GISPZJZ 沒有學習任何技能點,現在 GISPZJZ 想知道,他最多能夠學習技能池裏的多少個技能。

輸入:

第一行一個正整數nn​。

接下來 nn 行,第i+1i+1 行先輸入一個整數 sis_i,接下來輸入sis_i 個正整數 as1,as2,,asia_{s_1},a_{s_2},…,a_{s_i}。 表示學習第 ii 個技能,需要先學習的技能點。si=0s_i=0 表示學習ii 技能沒有任何前置條件。

輸出:

一行一個整數 ,表示 GISPZJZ 能學習的最大技能數。

樣例輸入:

4
0
1 1
2 1 4
2 1 3

樣例輸出:

2

樣例說明:

GISPZJZ 可以按順序學習技能 1,技能 2,然後無法獲得其他的技能點。

數據範圍:

對於 10%10\%的數據,1n101s1+s2++sn101≤n≤10,1≤s_1+s_2+…+s_n≤10

對於 40%40\%的數據,1n5001s1+s2++sn5001≤n≤500,1≤s_1+s_2+…+s_n≤500

對於額外 10%10\%的數據,滿足對任意 1insi11≤i≤n,s_i\ge 1

對於額外 20%20\%的數據,滿足對任意 1insi11≤i≤n,s_i≤1

對於 100%100\%的數據,1n1000001s1+s2++sn1000001≤n≤100000,1≤s_1+s_2+…+s_n≤100000

題解

技能加點相當於一個圖,每次將入度爲00的點刪去,更新其他點的入度,答案+1+1,類似於拓撲排序。

不知道爲什麼考場上腦子抽了寫一個用優先隊列的O(nlogn)O(n\log n)算法。。。

代碼
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
struct sd{int id,du;};
bool operator<(sd a,sd b){return a.du>b.du;}
int ru[M],n,ans;
bool vis[M];
vector<int>mmp[M];
priority_queue<sd>dui;
void in()
{
	scanf("%d",&n);
	for(int i=1,j,a,b;i<=n;dui.push((sd){i,ru[i]}),++i)
	for(scanf("%d",&a),ru[i]=a,j=1;j<=a;++j)
	scanf("%d",&b),mmp[b].push_back(i);
}
void ac()
{
	for(sd f;!dui.empty();)
	{
		f=dui.top();dui.pop();
		if(vis[f.id])continue;
		if(f.du)break;
		vis[f.id]=1,++ans;
		for(int i=mmp[f.id].size()-1;i>=0;--i)
		dui.push((sd){mmp[f.id][i],--ru[mmp[f.id][i]]});
	}
	printf("%d",ans);
}
int main(){in(),ac();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章