PKU 1094 关系矩阵实现的拓朴排序

题目分的三种情况 不能有环出现
判断环的时候在处理输入的时候判断 另外还在处理完后有一个三重循环的判断

这个代码是参考过别人的 最近没怎么做 手很生···

#include <iostream>
using namespace std;

int sorted[27];
int map[27][27];
char str[200][4];
int main()
{
 int n,m;

 int t;
 int i,j,k;
L2:
 while(scanf("%d%d",&n,&m)==2 && n &&m)
 {

  for(t=1;t<=m;t++)
   scanf("%s",str[t]);

  memset(map,0,sizeof(map));

  for(t=1;t<=m;t++)
  {   
   i=str[t][0]-'A'+ 1;
   j = str[t][2]-'A'+ 1;
   switch(str[t][1])
   {
    case '>':
     if(map[i][j] == -1 || map[j][i] == 1)
      goto RESTRIC;
     map[i][j] = 1;
     map[j][i] = -1;
     break;
    case '<':
     if(map[i][j] == 1 || map[j][i] == -1)
      goto RESTRIC;
     map[i][j] = -1;
     map[j][i] = 1;
     break;
   }
   
   for(k=1;k<=n;k++)
    for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
     {
      if(map[i][k] && map[k][j] && k!=i && i!=j )
      {
       if(!map[i][j])
       {
        if(map[i][k] == map[k][j])
        {
         map[i][j] = map[i][k];
         map[j][i] = -map[i][k];
        }
       }
       else
       {
        if(map[i][k] == map[k][j])
        {
         if(map[i][k] != map[i][j])
          goto RESTRIC;
        }
       }
      }
     }
 
   for(i=1;i<=n;i++)
   {
    int p = 1;
    for(j=1;j<=n;j++)
    {
     if(i!=j)
     {
      if(map[i][j] == 0)
       goto L;
      if(map[i][j] == 1)
       p++;
     }
    }
    sorted[p] = i;
   }
   
   printf("Sorted sequence determined after %d relations: ",t);
   for(i=1;i<=n;i++)
    putchar(sorted[i]+'A'-1);
   printf(".\n");
   goto L2;
L:
 ;    
  }
  
  printf("Sorted sequence cannot be determined.\n");
  
  continue;
RESTRIC:
  printf("Inconsistency found after %d relations.\n",t);
   
 }
 return 0;
}

posted on 2008-01-05 23:46 Victordu 阅读(830) 评论(2)  编辑 收藏 引用

评论

# re: PKU 1094 关系矩阵实现的拓朴排序 2008-03-05 17:27 卢亚德

哥们,我来你这里看看啊
1094 我错了好多次啊 看看错在哪里啊
//拓扑排序,邻接阵形式,复杂度O(n^2)
//如果无法完成排序,返回0,否则返回1,ret返回有序点列
//传入图的大小n和邻接阵mat,不相邻点边权0
#include<iostream>
using namespace std;
#define maxn 30
int mat[maxn][maxn],ret[maxn],d[maxn],n,num;
int stack[maxn*10];
bool stat[maxn];

bool toposort( )
{
int i,j,pos,top=0,t=0;
for(i=0;i<n;i++)
for(d[i]=j=0;j<n;j++)
if(mat[j][i]==1)d[i]++;
//memset(stack,-1,sizeof(stack));

for(top=i=0;i<n;i++)
if(!d[i]&&stat[i])
{
pos=i;t++;
}
if(t==1)stack[top++]=pos;
else if(t>1)return false;
while(top>0)
{
pos=stack[--top];
ret[num++]=pos;d[pos]=-1;
for(i=0;i<n;i++)
if(mat[pos][i]==1)d[i]--;

for(t=i=0;i<n;i++)
if(!d[i]&&stat[i])
{
pos=i;t++;
}
if(t==1)stack[top++]=pos;
else if(t>1) return false;
}
if(num==n)return true;

return false;
}


int main( )
{
int i,j,m,a,b;
char s[5],c; bool flag;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(!m&&!n)break;
flag=true;num=0;
memset(ret,0,sizeof(ret));
memset(mat,0,sizeof(mat));
memset(stat,0,sizeof(stat));

for(i=1;i<=m;i++)
{
scanf("%s",s);
a=s[0]-'A';b=s[2]-'A';
stat[a]=true;stat[b]=true;
mat[a][b]=1;
if(toposort( )&&flag)
{
flag=false;
printf("Sorted sequence determined after %d relations: \n",i);
for(j=0;j<n;j++)
{
c=ret[j]+'A';
printf("%c",c);
}
printf("\n");
}
else
{
memset(ret,0,sizeof(ret));
num=0;
}
}
num=0;memset(ret,0,sizeof(ret));
toposort( );
if(!num&&flag)printf("Inconsistency found after %d relations.\n",m);
else if(num&&num<n&&flag)
printf("Sorted sequence cannot be determined.\n");
}

return 0;
}  回复  更多评论   

# re: PKU 1094 关系矩阵实现的拓朴排序 2008-03-17 01:22 张棚

呵呵。。
楼上是ecnu cs 的嘛。。
这道题我也不会拓扑。
不过我用 floyd 做的。呵呵。
虽然慢了点....
^_^  回复  更多评论   


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


导航

<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

常用链接

留言簿(5)

随笔档案(46)

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜