poj 1778 All Discs Considered

拓扑排序
#include <cstdio>
#include 
<iostream>
#include 
<queue>
#include 
<vector>
#include 
<algorithm>

using namespace std;

const int MAX= 100100;

vector
<int> num[MAX];
queue
<int> que[2];
int n1, n2, d;
int dat[MAX], bak[MAX];

int line(int k)
{
    
return k>n1?1:0;
}

int bfs( int k )
{
    
int i;
    
for ( i = 0 ; i < 2 ; i++ )
    {
        
while ( !que[i].empty() )
            que[i].pop();
    }
    
for ( i = 1 ; i <= n1+n2 ; i++ )
    {
        
if ( !dat[i] )
            que[line(i)].push(i);
    }
    
int count = 1 ;
    
while ( !que[0].empty() || !que[1].empty() )
    {
        
while(!que[k].empty())
        {
            
int t= que[k].front();
            que[k].pop();
            
for ( i = 0 ; i < num[t].size() ; i++ )
            {
                
if ( !(--dat[num[t][i]]) )
                {
                    que[line(num[t][i])].push(num[t][i]);
                }
            }
        }
        k
^=1;
        count
++;
    }
    
return count;
}

int main()
{
    
while ( scanf("%d%d%d"&n1, &n2, &d) , n1 || n2 || d )
    {
        
int i, x, y;
        
for ( i = 1 ; i <= n1+n2 ; i++ )
        {
            num[i].clear();
            bak[i]
= 0;
        }
        
for ( i = 0 ; i < d ; i++ )
        {
            scanf(
"%d%d"&x, &y);
            num[y].push_back(x);
            bak[x]
++;
        }
        
for ( i = 1 ; i <= n1+n2 ; i++ )
            dat[i]
=bak[i];
        x
=bfs(0);
        
for ( i = 1 ; i <= n1+n2 ; i++ )
            dat[i]
=bak[i];
        y
=bfs(1);
        printf(
"%d\n", x<y?x:y);
    }
    
return 0;
}

posted on 2011-08-24 00:47 purplest 阅读(281) 评论(0)  编辑 收藏 引用 所属分类:


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


<2011年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

随笔分类(70)

随笔档案(68)

ACMer

搜索

最新随笔

最新评论