现在的位置: 首页 > 综合 > 正文

UVA – 1423 (大小关系的拓扑排序)

2019年04月05日 ⁄ 综合 ⁄ 共 1087字 ⁄ 字号 评论关闭
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;

const int maxn = 12;

int n;
char maze[maxn][maxn],str[maxn*maxn];
int vis[maxn];
vector<int> son[maxn],topo;
int ans[maxn];
void dfs(int u){
vis[u]=1;
for(int i=0;i<son[u].size();i++) if(!vis[son[u][i]]){
    dfs(son[u][i]);
}
topo.push_back(u);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        scanf("%s",str);
        memset(maze,0,sizeof(maze));
        for(int i=0;i<=n;i++) son[i].clear();
        int k=0;
        for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++){
                 switch(str[k++]){
                 case '+': son[j].push_back(i-1); break;
                 case '-': son[i-1].push_back(j); break;
                 case '0': maze[i-1][j]=maze[j][i-1]=1; break;
                 }
         }
         memset(vis,0,sizeof(vis));
         topo.clear();
         for(int i=0;i<=n;i++){
             if(!vis[i]) dfs(i);
         }
         int p;
         for(int i=0;i<topo.size();i++){
               if(topo[i]==0) {p=i; break;}
         }
         int j=0;
         for(int i=p-1;i>=0;i--){
            if(maze[topo[i]][topo[i+1]]) ans[topo[i]]=j;
            else ans[topo[i]]= (--j);
         } j=0;
         for(int i=p+1;i<topo.size();i++){
           if(maze[topo[i]][topo[i-1]]) ans[topo[i]]=j;
           else ans[topo[i]]= (++j);
         }
         for(int i=1;i<=n;i++){
             if(i!=1) printf(" ");
             printf("%d",ans[i]-ans[i-1]);
         }
         printf("\n");
    }
    return 0;
}

抱歉!评论已关闭.