标签:eof 字母数 cannot out 进入 ati ++ 题目 break
------------恢复内容开始------------
题面:https://www.luogu.com.cn/problem/P1347
明确题目中三种结果的关系。
对于每一个输入的条件,我们都进行拓扑。
Ⅰ如果发现本次拓扑进入队列的点不是所有的点 ,说明有环,那么后续无论如何都是不能确定大小关系的,直接输出
Ⅱ如果单次有两个入度为0的点压入队列,那我们是不能确定大小关系的
Ⅳ不满足以上条件且所有的点都进入了队列,那说明可行
#include <bits/stdc++.h> using namespace std; int n,m,vis[39],indug[39],t[39]; string a[30009]; vector<int>vec[39]; string s; int tuopu(int k) { queue<int>q; int up=0,f=0,num=0; for(int i=1;i<=n;i++) { if(vis[i]&&!t[i])//字母出现过 { f++;num++;s+=char(i+‘A‘-1); q.push(i); if(f>1) up=1;//无法判断 } } while(!q.empty()) { int now=q.front();q.pop(); int f=0;//同理,如过一次出现2个点,无法判断 for(int i=0;i<vec[now].size();i++) { int w=vec[now][i]; if(--t[w]==0) { f++; if(f>1) up=1;//无法判断关系 s+=char(w+‘A‘-1); num++; q.push(w); } } } if(num!=k) return -1;//出现环 if(up) return 100;//无法判断 if(num==n) return 1;//成功 } int main() { cin>>n>>m; for(int i=0;i<=26;i++) vec[i].clear(); memset(vis,0,sizeof(vis)); memset(indug,0,sizeof(indug)); for(int i=1;i<=m;i++) cin>>a[i]; int i,k=0,ok=-1;//出现的字母数 string ans;s=""; for(i=1;i<=m;i++) { s="";//每次tuopu构造的字符串 int l=a[i][0]-‘A‘+1,r=a[i][2]-‘A‘+1; vec[l].push_back(r);indug[r]++; for(int j=0;j<=26;j++) t[j]=indug[j];//供tuopu使用 if(vis[l]==0) k++; if(vis[r]==0) k++;//统计目前有多少字符 vis[l]=vis[r]=1; int z=tuopu(k); if(z==-1) break;//有环 if(z==1)//成功 { ans=s,ok=i; break; } } if(i!=m+1&&ok==-1)//有环形,矛盾 cout<<"Inconsistency found after "<<i<<" relations."<<endl; else if(ok!=-1)//成功 cout<<"Sorted sequence determined after "<<ok<<" relations: "<<ans<<"."<<endl; else cout<<"Sorted sequence cannot be determined."<<endl; }
------------恢复内容结束------------
标签:eof 字母数 cannot out 进入 ati ++ 题目 break
原文地址:https://www.cnblogs.com/iss-ue/p/12503302.html