POJ1094 Sorting It All Out(拓扑排序)

http://acm.pku.edu.cn/JudgeOnline/problem?id=1094
拓扑排序,能确定顺序的情况是在拓扑排序时每个时刻入度为0的顶点只有一个。
#include<iostream>
#include
<fstream>
using namespace std;

int n,degree[30],res[30];
struct Node
{
    
int pos;
    Node 
*next;
}
node[30];

void insert(char a,char b)
{
    
int aa=a-'A';
    
int bb=b-'A';
    Node 
*p=new Node;
    p
->pos=bb;
    p
->next=node[aa].next;
    node[aa].next
=p;
}


int top_sort()
{
    
bool flag=false;
    
int in[30]={0};
    
int i,tmp,top,sta[100];
    
for(i=0,top=0;i<n;i++)
    
{
        
in[i]=degree[i];
        
if(in[i]==0)    sta[top++]=i;
    }

    
if(top>1)    flag=true;
/*    for(i=0;i<n;i++)
        printf("%d ",in[i]);
    puts("");
*/

    
for(i=0;i<n;i++)
    
{
        
if(top==0)    return -1;
        
if(top>1)    flag=true;
        tmp
=sta[--top];
        res[i]
=tmp;
        Node 
*p=node[tmp].next;
        
while(p)
        
{
            
if(--in[p->pos]==0)
                sta[top
++]=p->pos;
            p
=p->next;
        }

    }

    
if(flag)    return 0;
    
return 1;
}


int main()
{
    
bool flag,incon;
    
int i,m,num=0,tmp;
    
char str[4];
    ifstream input;
    input.open(
"in.txt");
//    while(input>>n>>m)
    while(scanf("%d%d",&n,&m))
    
{
        
if(n==0&&m==0)    break;
        flag
=incon=false;
        memset(degree,
0,sizeof(degree));
        
for(i=0;i<n;i++)
            node[i].next
=NULL;
        
for(i=1;i<=m;i++)
        
{
            scanf(
"%s",str);
        
//    input>>str;
            if((!flag)&&(!incon))
            
{
                degree[str[
2]-'A']++;
                 insert(str[
0],str[2]);
                tmp
=top_sort();
                
if(tmp==-1)
                
{
                    num
=i;
                    incon
=true;
                }

                
else if(tmp==1)
                
{
                    num
=i;
                    flag
=true;
                }

            }

        }

        
if(flag)
        
{
            printf(
"Sorted sequence determined after %d relations: ",num);
            
for(i=0;i<n;i++)
                printf(
"%c",'A'+res[i]);
            puts(
".");
        }

        
else if(incon)    printf("Inconsistency found after %d relations.\n",num);
        
else    printf("Sorted sequence cannot be determined.\n");
    }

    system(
"pause");
    
return 0;
}

posted on 2010-05-22 23:16 CisJiong 阅读(293) 评论(0)  编辑 收藏 引用 所属分类: PKUGraph


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

统计

常用链接

留言簿(2)

随笔分类(16)

随笔档案(11)

最新随笔

最新评论