有哪位dalao可以指导一下我这个题目怎么做吗?
  • 板块P1113 杂务
  • 楼主Jared0503
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/1/10 21:32
  • 上次更新2024/1/11 13:07:31
查看原帖
有哪位dalao可以指导一下我这个题目怎么做吗?
1074812
Jared0503楼主2024/1/10 21:32

代码献上

#include<bits/stdc++.h>
using namespace std;
bool maps[10010][10010];
int n,times[10010],stacks[10010],top,maxn,cnt;
//maps[a][b] 表示可以从a点走到b点,b点入度就为maps[n][b],其中n表示所有为true的点 
int du(int num)
{
	int count_=0;
	for(int i=1;i<=n;i++) if(maps[i][num]) count_++;
	return count_;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int a,b;
		cin>>a>>times[i];
		while(cin>>b)
		{
			if(!b) break;
			maps[a][b]=1; 
		}
	}
	for(int i=1;i<=n;i++) 
	{
		if(!du(i)) 
		{
			maxn=max(maxn,times[i]),stacks[++top]=i; //将所有入度为0的点压入栈 
		}
	}
	while(top>0) 
	{
		int num=stacks[top--];
		for(int i=1;i<=n;i++) 
		{
			if(!du(i)) 
			{
				maps[i][num]=0,stacks[++top]=i; //入栈操作 
				cnt+=maxn; //记录所需时间 
				maxn=max(maxn,times[i]);
			}
		}
	}
	cout<<cnt;
} 
2024/1/10 21:32
加载中...