题目链接
http://poj.org/problem?id=1094
题意
有n个字母,输入m个小于关系,问到第几个可以:
1.确定出这n个字母的关系。
2.确定它们之间关系矛盾了。
3.m条关系都给出了,n个字母关系仍不确定。
思路
每次输入一条边,就进行一次拓扑排序。需要注意的是:
1.(3)(关系不确定) 优先级最低,只有当(1),(2)都没有被判定,最后才能判定3.
2.(1),(2)谁先出现判定谁,不管后面的输入是否还会出现。
#include<cstdio>
#include<queue>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<string>
#include<set>
#include<stack>
#include<algorithm>
#define cle(a) memset(a,0,sizeof(a))
#define inf(a) memset(a,0x3f,sizeof(a))
#define ll long long
#define Rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
#define INF2 9223372036854775807ll
const int INF = ( 2e9 ) + 2;
const ll maxn = 30;
vector<int> g[maxn];
map<char,int> mp;
vector<int> ans;
int In[maxn];
char mp2[50];
int c[200][200];
int topsort(int n)//n为拓扑排序,图中点的个数。返回值含义:1 conflict 2 cannot 3 ok
{
queue<int> q;
ans.clear();
int IN[maxn];
for(int i=1;i<=n;i++)
IN[i]=In[i];
int cnt=0,f=0;
for(int i=1;i<=n;i++)
if(IN[i]==0)
{
cnt++;
q.push(i);
ans.push_back(i);
}
if(cnt==0)f = 1;
if(cnt>=2)f = 2;
cnt=0;
while(!q.empty())
{
int u=q.front();q.pop();
int fl=0;
for(int i=0,L=g[u].size();i<L;i++)
{
int v=g[u][i];
IN[v]--;
if(IN[v]==0)
{
q.push(v);
ans.push_back(v);
fl++;
}
}
if(fl>=2)f = 2;
cnt++;
}
if(f==1||cnt<n)return 1; // 不确定与冲突,优先冲突
if(cnt==n&&f==0)return 3;
else if(f==2) return 2;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)&&(n+m)) //每加一条边,就top排序。
{
memset(In,0,sizeof(In));
for(int i=0;i<=n;i++)g[i].clear();
memset(c,0,sizeof(c));
mp.clear();
char a,b,op;
int cnt=0,flag=0,pos;
for(int i=1;i<=m;i++)
{
cin>>a>>op>>b;
if(flag)continue;
if(mp[a]==0)
{
mp[a]=++cnt;
mp2[cnt]=a;
}
if(mp[b]==0)
{
mp[b]=++cnt;
mp2[cnt]=b;
}
if(c[mp[a]][mp[b]])continue;
c[mp[a]][mp[b]]=1;
g[mp[a]].push_back(mp[b]);
In[mp[b]]++;
int temp=topsort(cnt);
if(temp==3&&cnt==n)
{
flag=1;
printf("Sorted sequence determined after %d relations: ",i);
for(int i=0,L=ans.size();i<L;i++)
printf("%c",mp2[ans[i]]);
printf(".\n");
}
else if(temp==1)
{
printf("Inconsistency found after %d relations.\n",i);
flag=1;
}
}
if(!flag)
printf("Sorted sequence cannot be determined.\n");
}
}