zoukankan      html  css  js  c++  java
  • poj1128拓扑排序

      按照硕神的说法,以无比丑的姿势 建了个图。然后裸搞 拓扑排序

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string>
    #include <iostream>
    #include <map>
    #include <cstdlib>
    #include <list>
    #include <set>
    #include <queue>
    #include <stack>
    #include<math.h>
    using namespace std;
    struct Node
    {
        int l;int r;int up;int down;
    }node[1111111];
    int sum;
    const int INF=0xfffffff;
    int Map[100][100];
    int out[100];
    int in[100];
    int path[1000];
    int vis[1000];
    int vis1[1111];
    void dfs(int cnt)
    {
        if(cnt==sum){
            for(int i =0 ;i< sum;i++)
                printf("%c",path[i]+'A');
            cout<<endl;
            return ;
        }
        for(int i =0 ;i<26;i++){
            if(vis[i]&&out[i]==0&&!vis1[i]){
                vis1[i]=1;
                path[cnt]=i;
                for(int j=0;j<26;j++){
                    if(Map[j][i]) out[j]--;
                }
                dfs(cnt+1);
                for(int j=0;j<26;j++){
                    if(Map[j][i]) out[j]++;
                }
                vis1[i]=0;
            }
        }
    
    }
    int main()
    {
        int n,m;
        char str[100][1111];
        while( cin>>n>>m){
        sum=0;
        memset(Map,0,sizeof(Map));
        memset(out,0,sizeof(out));
        memset(in, 0,sizeof(in));
        memset(vis,0,sizeof(vis));
        memset(vis1,0,sizeof(vis1));
        for(int i = 0 ;i< 100;i++){
            node[i].down=INF;node[i].up=0;node[i].r=0;node[i].l=INF;
        }
        for(int i =0 ;i<n;i++)
            scanf("%s",str[i]);
        for(int i =0 ;i<n;i++){
            for(int j=0;j<m;j++){
                if(str[i][j]>'Z'||str[i][j]<'A')continue;
                int t=str[i][j]-'A';
                if(i<node[t].down) node[t].down = i;
                if(i>node[t].up) node[t].up=i;
                if(j>node[t].r) node[t].r= j;
                if(j<node[t].l) node[t].l=j;
                vis[t]=1;
            }
        }
        for(int i= 0;i<26;i++)
            if(vis[i]) sum++;
        for(int t=0;t<26;t++){
            if(!vis[t]) continue;
            int l=node[t].l;int r=node[t].r;int up=node[t].up;int down = node[t].down;
            int i = down;
            for(int j = l;j<=r;j++){
                if(str[i][j]>'Z'||str[i][j]<'A')continue;
                int cc=str[i][j]-'A';
                if(cc!=t&&!Map[cc][t]) {
                    Map[cc][t]= 1;
                    out[cc]++;
                }
            }
            i=up;
            for(int j =l;j<=r;j++){
                if(str[i][j]>'Z'||str[i][j]<'A')continue;
                int cc=str[i][j]-'A';
                if(cc!=t&&!Map[cc][t]) {
                    Map[cc][t]= 1;
                    out[cc]++;
                }
            }
            int j= l;
            for(int i = down+1;i<up;i++){
                if(str[i][j]>'Z'||str[i][j]<'A')continue;
                int cc=str[i][j]-'A';
                if(cc!=t&&!Map[cc][t]) {
                    Map[cc][t]= 1;
                    out[cc]++;
                }
            }
            j= r;
            for(int i = down+1;i<up;i++){
                if(str[i ][j]>'Z'||str[i][j]<'A')continue;
                int cc=str[i][j]-'A';
                if(cc!=t&&!Map[cc][t]) {
                    Map[cc][t]= 1;
                    out[cc]++;
                }
            }
        }
        dfs(0);
        }
        return 0;
    }
  • 相关阅读:
    linux中systemctl详细理解及常用命令
    Hadoop中的java基本类型的序列化封装类
    理解javaBean
    hadoop之mr框架的源码理解注意点
    python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程
    Hadoop MapReduce执行过程详解(带hadoop例子)
    为什么hadoop中用到的序列化不是java的serilaziable接口去序列化而是使用Writable序列化框架
    Java代码如何关联Hadoop源码
    关于版本控制
    GIT和SVN之间的五个基本区别
  • 原文地址:https://www.cnblogs.com/yigexigua/p/3897861.html
Copyright © 2011-2022 走看看