POJ1094 Sorting It All Out

3 篇文章 0 订阅

拓扑排序题,每加入一条边,判断

(1)形成有向环,退出

(2)形成唯一拓扑顺序,退出

(3)加入所有边后,仍无法确定唯一拓扑顺序


注意判断的优先级!!!


#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

int n,m,nn,ans,flag;
int g[30][30],d[30];
bool vis[30],qt;
char str[5],order[30];

int topo(){
	int td[30],k=0,no=0;
	for (int i=0;i<n;i++) td[i]=d[i];
	queue<int> Q;
	for (int i=0;i<n;i++)
		if (td[i]==0) Q.push(i);
	while (!Q.empty()){
		if (Q.size()!=1) no=1;
		int u=Q.front(); Q.pop();
		order[k++]=u+'A';
		for (int v=0;v<n;v++){
			if (u==v) continue;
			if (g[u][v]){
				td[v]--;
				if (td[v]==0) Q.push(v);
			}
		}
	}
	if (k<nn) return -1;
	if (no||k<n) return 0;
	order[k]='\0';
	return 1;
}

int main(){
	while (scanf("%d%d",&n,&m)==2 && (n||m)){
		memset(g,0,sizeof(g));
		memset(d,0,sizeof(d));
		memset(vis,0,sizeof(vis));
		nn=0; qt=0;
		for (ans=1;ans<=m;ans++){
			scanf("%s",str);
			if (qt) continue;
			if (!vis[str[0]-'A']) {vis[str[0]-'A']=1; nn++;}
			if (!vis[str[2]-'A']) {vis[str[2]-'A']=1; nn++;}
			if (g[str[0]-'A'][str[2]-'A']==0){g[str[0]-'A'][str[2]-'A']=1; d[str[2]-'A']++;}
			flag=topo();
			if (flag==1) {printf("Sorted sequence determined after %d relations: %s.\n",ans,order); qt=1;}
			if (flag==-1) {printf("Inconsistency found after %d relations.\n",ans); qt=1;}
		}
		if (qt==0) puts("Sorted sequence cannot be determined.");
	}
	return 0;
}

第一次写紧缩风格的代码,总觉得好丑= =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值