【SSL】1129字母排序

【SSL】1129字母排序

Time Limit:1000MS
Memory Limit:65536K

Description

输入一连串的字母间的小于关系 输出最后的排序
比如输入: A

Input

两个整数 n m (2<=n<=26) (当n=m=0时结束)
m 行"小于关系" (只有小于<)

Output

如果最后的排序存在,输出: Sorted sequence determined after xxx relations: yyy…y.
如果无法完成排序 输出: Sorted sequence cannot be determined.
如果在第x个关系后出现矛盾(如A<B,B<C,C<A) 输出: Inconsistency found after x relations.

Sample Input

4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0

Sample Output

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.

Hint

zju

思路

【洛谷】P1347 排序的多组数据版,每次要置初值。
每输入一次,做一次拓扑排序。
矛盾输出
Inconsistency found after x relations.
排序唯一输出
Sorted sequence determined after xxx relations: yyy…y.

代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
long long ans[610],tot,n,m,head[610],ins[610],inst[610],q[610];
char str[610];
string answer;
struct jgt
{
	long long x,y,nxt;
}f[610];
int topsort()
{
	long long i,l,r=0;
	for(i=1;i<=n;i++)
		if(!inst[i])
		{
			q[++r]=i;
			ans[i]=1;
		}
	for(l=1;l<=r;l++)
	{
		for(i=head[q[l]];i;i=f[i].nxt)//更新入度 
		{
			inst[f[i].y]--;
			ans[f[i].y]=max(ans[f[i].y],ans[q[l]]+1);
			if(!inst[f[i].y])//当能够到达这个点的所有点都遍历过后将这个点加入队列
				q[++r]=f[i].y;
		}
	}
	if(r<n)//矛盾 
		return 0;
	if(ans[q[r]]==n)//排序唯一 
	{
		for(i=1;i<=r;i++)
			answer+=char(q[i]+'A'-1);
		return 1;
	}
	return -1;
}
int main()
{
	long long i,j,t;
	bool light;
	scanf("%lld%lld",&n,&m);
	while(n||m)
	{
		tot=0;
		light=1;
		answer="";
		memset(ins,0,sizeof(ins));
		memset(head,0,sizeof(head));
		memset(ans,0,sizeof(ans));
		memset(inst,0,sizeof(inst));
		memset(q,0,sizeof(q));
		for(i=1;i<=m;i++)
		{
			tot++;
			scanf("%s",&str);
			f[tot].x=str[0]-'A'+1;
			f[tot].y=str[2]-'A'+1;
			f[tot].nxt=head[f[tot].x];
			head[f[tot].x]=tot;
			ins[f[tot].y]++;
			for(j=1;j<=n;j++)
				inst[j]=ins[j];
			t=topsort();
			if(t==0)
			{
				printf("Inconsistency found after %lld relations.\n",i);
				light=0;
				for(i++;i<=m;i++)scanf("%*s");
			}
			if(t==1)
			{
				printf("Sorted sequence determined after %lld relations: %s.\n",i,answer.c_str());
				light=0;
				for(i++;i<=m;i++)scanf("%*s");
			}
		}
		if(light)
			printf("Sorted sequence cannot be determined.\n");
		scanf("%lld%lld",&n,&m);
	} 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//初始化邮件类 void InitEmail(C01waSendMail* m_globalEmail,String sendermail,String sender,String senderpwd,String srv,int port = 25,bool bSsl = false) { m_globalEmail->m_Auth = CPJNSMTPConnection::AuthenticationMethod::AUTH_AUTO; m_globalEmail->m_bAutoDial = true; m_globalEmail->m_bSSL = bSsl; m_globalEmail->m_sUsername = sender.c_str(); m_globalEmail->m_sAddress = sendermail.c_str(); m_globalEmail->m_sPassword = senderpwd.c_str(); m_globalEmail->m_sHost = srv.c_str(); m_globalEmail->m_nPort = port; m_globalEmail->m_sEncodingFriendly = _T("Chinese Simplified (GB2312)"); m_globalEmail->m_sEncodingCharset = _T("gb2312"); m_globalEmail->m_bMime = 1; m_globalEmail->m_bHTML = 1; m_globalEmail->m_Priority = CPJNSMTPMessage::PRIORITY::NormalPriority; m_globalEmail->m_bDSN = FALSE; m_globalEmail->m_bDSNSuccess = FALSE; m_globalEmail->m_bDSNFailure = FALSE; m_globalEmail->m_bDSNDelay = FALSE; m_globalEmail->m_bDSNHeaders = FALSE; m_globalEmail->m_bDNSLookup = FALSE; } //发送邮件 void SendEmail(const char* recvemail,const char* subject,const char* body,const char * sCC=NULL,const char * bCC = NULL,const char * attach = NULL) { //初始化邮箱 //注意释放内存 C01waSendMail *m_globalEmail = new C01waSendMail; if(strlen(m_con1.m_eamil)>0&&strlen(m_con1.m_pwd)&&strlen(m_con1.m_smtpsrv)&&m_con1.port>0) { char * p = strdup(m_con1.m_eamil); char * pp = strstr(p,"@"); if(pp>0) pp[0] = '\0'; InitEmail(m_globalEmail,m_con1.m_eamil,p,m_con1.m_pwd,m_con1.m_smtpsrv,m_con1.port,m_con1.ssl); free(p); if(subject>0) m_globalEmail->m_sSubject.Format("%s",subject); if(sCC>0) m_globalEmail->m_sCC.Format("%s",sCC); if(bCC>0) m_globalEmail->m_sBCC.Format("%s",bCC); if(body>0) m_globalEmail->m_sBody.Format("%s",body); if(attach>0) m_globalEmail->m_sFile.Format("%s",attach); if(recvemail>0) m_globalEmail->m_sTo.Format("%s",recvemail); m_globalEmail->SendEmail(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值