UVALive 6467 Strahler Order 拓扑排序

水题。给你n个点m条边。入度为0的点标为1,如果一个点只有一个点指向,那么它标为那个点的标数。如果一个点有两个或以上相同标号的点指向。那么给它标为i+1,如果有更大的话就标为更大的。求最大的标号。

拓扑排序

//First Edit Time:	2014-07-15 12:40
//Last Edit Time:	2014-07-15 12:40
//Filename:C.cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
#define MAXN 1010
#define INF_INT 0xfffff0
vector <int> e[MAXN];
int n,m;
int dis[MAXN],cnt[MAXN],pre[MAXN];
int ru[MAXN];
int bfs(){
    queue <int> q;
    for(int i=1;i<=n;i++){
        dis[i]=0;
        pre[i]=-1;
        cnt[i]=0;
        if(ru[i]==0){
            q.push(i);
            cnt[i]=1;
            dis[i]=1;
        }
    }
    while(!q.empty()){
        int now=q.front();
        q.pop();
        for(int i=0;i<(int)e[now].size();i++){
            int next=e[now][i];
            if(pre[next]==-1){
                pre[next]=dis[now];
                dis[next]=dis[now];
                cnt[next]=1;
            }
            else{
                if(pre[next]<dis[now]){
                    pre[next]=dis[now];
                    dis[next]=dis[now];
                    cnt[next]=1;
                }
                else if(pre[next]==dis[now]&&cnt[next]==1){
                    if(dis[next]!=dis[now]+1){
                        dis[next]=dis[now]+1;
                    }
                }
            }
            --ru[next];
            if(ru[next]==0){
                q.push(next);
            }
        }
    }
    int mm=dis[1];
    for(int i=2;i<=n;i++)
        if(dis[i]>mm)mm=dis[i];
    /*
    for(int i=1;i<=n;i++){
        printf("%d ",dis[i]);
    }
    puts("");
    */
    return mm;
}
int main()
{
    int t,cas;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&cas);
        scanf("%d%d",&n,&m);
        for(int i=0;i<n+2;i++)e[i].clear();
        memset(ru,0,sizeof(ru));
        for(int i=0,x,y;i<m;i++){
            scanf("%d%d",&x,&y);
            e[x].push_back(y);
            ++ru[y];
        }
        printf("%d %d\n",cas,bfs());
    }
    return 0;
}


你可能感兴趣的:(拓扑排序)