UVALive 6467 Strahler Order

来源:互联网 发布:mac u盘图标 编辑:程序博客网 时间:2024/06/05 23:42

拓扑排序

#include <cstdio>#include <cstring>#include <iostream>#include <queue>using namespace std;int const MAXN = 1010;queue<int> q;int maze[MAXN][MAXN],d[MAXN];void Clear(){    while(!q.empty()){        q.pop();    }    memset(maze,0,sizeof(maze));    memset(d,0,sizeof(d));}int TopoSort(int n){    int du[MAXN],vis[MAXN];    memset(du,0,sizeof(du));    memset(vis,0,sizeof(vis));    for(int i = 1;i <= n;i++){        if(!d[i]){            du[i] = 1;            q.push(i);        }    }    while(!q.empty()){        int s = q.front();        q.pop();        if(vis[s]){            vis[s] = 0;            du[s]++;        }        for(int i = 1;i <= n;i++){            if(!maze[s][i]) continue;            if(du[s] == du[i]) vis[i] = 1;//刚开始为0  如果俩个相等代表之前 连接过一个 标号为du[s] 的 或者 >= 2 个 du[s] -1 的            if(du[s] > du[i]){                vis[i] = 0;                du[i] = du[s];            }            d[i]--;            if(!d[i])q.push(i);        }    }    int m = -1;    for(int i = 1;i <= n;i++){        m = m > du[i]? m : du[i];    }    return m;}int main(){    int t;    while(~scanf("%d",&t)){        while(t--){            Clear();            int k,n,m;            scanf("%d%d%d",&k,&n,&m);            for(int i = 0;i < m;i++){                int u,v;                scanf("%d%d",&u,&v);                maze[u][v] = 1;                d[v]++;//存入度            }            int s = TopoSort(n);            printf("%d %d\n",k,s);        }    }    return 0;}/*11 7 81 32 36 43 43 56 75 74 7*/


0 0
原创粉丝点击