HDU 4857

本文介绍了一种基于反向拓扑排序的问题解决方法,针对特定的排队问题,通过使用优先队列和邻接表来确保高优先级的人排在前面,并提供了完整的C++代码示例。

戳一戳 --> 逃生


糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。 

现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。 
同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。 

负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。 

那么你就要安排大家的顺序。我们保证一定有解。
Input第一行一个整数T(1 <= T <= 5),表示测试数据的个数。 
然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。 

然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同。Output对每个测试数据,输出一行排队的顺序,用空格隔开。Sample Input
1
5 10
3 5
1 4
2 5
1 2
3 4
1 4
2 3
1 5
3 5
1 2
Sample Output
1 2 3 4 5



反向拓扑排序???

什么鬼?

这篇博客有详解 反向拓扑

关键点:要求大的在前时需要逆向输入拓扑排序,比如 
2 
3 1 
3 1 
输出应该是3 1 2不是2 3 1,也就是说没出现的应该排到后边 
如果要求小的在前拓扑,则需要优先队列小的在前正向拓扑即可


#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring> 
using namespace std;
struct Node{
	int to;
	int ne;
}e[100000];
int head[100000],in[100000],ans[100000];
int n,m,x,y,T,cnt,s;
priority_queue<int >q;
void init()
{
	cnt = 0;
	s = 0;
	memset(head,-1,sizeof(head));
	memset(in,0,sizeof(in));
	memset(ans,0,sizeof(ans)); 
	while(!q.empty())
		q.pop();
}
void add(int u,int v)
{
	e[cnt].to = v;
	e[cnt].ne = head[u];
	head[u] = cnt++;
}
int main()
{
	cin>>T;
	while(T--)
	{
		init();
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&x,&y);
			add(y,x);
			in[x]++;
		}
		for(int i=1;i<=n;i++)
		{
			if(in[i]==0)
			 q.push(i);
		}
		while(!q.empty())
		{
			int k = q.top();
			q.pop();
			ans[++s] = k;
			for(int i=head[k];~i;i=e[i].ne)
			{
				int t = e[i].to;
				in[t]--;
				if(in[t]==0)
				{
					q.push(t);
				}
			}
		}
		for(int i=s;i>1;i--)
		printf("%d ",ans[i]);
		printf("%d\n",ans[1]);
	}
	return 0;
}


测试

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring> 
using namespace std;
struct Node{
	int to;
	int ne;
}e[100000];
int head[100000],out[100000],ans[100000];
int n,m,x,y,T,cnt,s;
priority_queue<int >q;
void init()
{
	cnt = 0;
	s = 0;
	memset(head,-1,sizeof(head));
	memset(out,0,sizeof(out));
	memset(ans,0,sizeof(ans)); 
	while(!q.empty())
		q.pop();
}
void add(int u,int v)
{
	e[cnt].to = v;
	e[cnt].ne = head[u];
	head[u] = cnt++;
}
int main()
{
	cin>>T;
	while(T--)
	{
		init();
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&x,&y);
			add(y,x);
			out[x]++;
		}
		for(int i =1;i<=n;i++)
		{
			printf("out[%d] = %d\n",i,out[i]);
		}
		for(int i=1;i<=n;i++)
		{
			if(out[i]==0){
			 q.push(i);
			 printf("q.push( %d )\n",i);
			}
		} 
		while(!q.empty())
		{
			int k = q.top();
			q.pop();
			ans[++s] = k;
			for(int i=head[k];~i;i=e[i].ne)
			{
				int t = e[i].to;
				out[t]--;
				printf("%d -- > %d  out[ %d ] = %d\n",t,k,t,out[t]);
				if(out[t]==0)
				{
					q.push(t);
				}
			}
		}
	}
	return 0;
}

1) 


2)


【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理与编程实现方法,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理与Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值