• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> WEB开发 >> .NET 开发 >> 详细内容
 

推荐文章

 
 

热点文章

  • FckEditor远程图片下载插件
  • TFS(Team Foundation Server)使用经验
  • IIS过滤器实现.NET程序不破解DLL替换字符串一法
  • 为ASP.NET封装的SQL数据库访问类
  • ASP.NET2.0中文验证码的实现
  • Url地址重写,利用HttpHander手工编译页面并按需生成静..
  • ASP.NET学习笔记一——ASP和ASP.NET比较
  • 使用HtmlInputHidden 控件在本页面保持状态和跨页面传..
  • ASP.Net发邮件
  • Silverlight 2.0中文学习资源集萃
  • WinForm中使用XtraGrid控件,实现在界面中动态修改列显..
  • 解析ASP.NET木马文件操作
 
 

相关文章

  • 快算24的算法
  • ACM UVa算法题209 Triangular Vertices的解法
  • ACM UVa 算法题 #202 - Repeating Decimals的解法
  • ACM UVa 算法题 #110 - Meta-Loopless Sort 的解法
  • ACM UVa 算法题 #108 - Maximum Sum的解法
  • ACM UVa 算法题 #507 - Jill Rides Again的解法
  • ACM UVa 算法题 #201 - Squares解法
  • ACM UVa 116 - Undirectional TSP的解法
  • ACM UVa 算法题100, 101, 103, 104, 112, 10405解法
  • 百度面试题(算法)
  • 张劲松:蚂蚁算法与SNS猜想
  • 获取 Google PR 代码Checksum 算法
 
 

百度搜索

 
 

ACM UVa 算法题 #200 - Rare Order的解法

  • 阅览次数:
  • 文章来源: http://blog.csdn.net/ATField/
  • 原文作者: ATField
  • 整理日期: 2008-07-20
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

题目链接在这里:ACM UVa #200 - Rare Order

本题的解法相对简单:

对于输入的所有字符串,只需两两比较,每个字符串可以获得一个不等关系(或者无法获得),如:

ZXY
ZXW

可以知道Y < W

按照此种方法依次两两比较,可以获得多个不等关系。

当有了不等关系之后,下一步是如何根据不等关系得到这些字符的Order。最有效的方法是拓扑排序(Topology Sort):首先对于每个不等关系,构造出图的一条边,比如Y < W可以构造出一条边,从W到Y。这样,当整个图构造完毕的时候,出度为0的就是最小的字母,然后去掉这个字母的结点及上面的所有边,再次获得出度为0的字母,这将是第二小的字母,依此类推可以获得所有字母的顺序。

这道题有两个地方需要注意:

  1. 有可能输入只有单个由单个字母组成的字符串,根据定义这种情况下也是合法的,如AAAAA,结果为A。这种情况需要加以特殊处理。
  2. 在构造不等关系的时候可能会遇到重复的不等关系,这个时候需要跳过,避免重复处理。(我就因为这个郁闷了好半天,一直WA)

 代码如下:

#include <stdio.h>
#include 
<stdlib.h>
#include 
<string.h>

#define MAX 30

void compare_str( const char *a, const char *b, int adj[MAX][MAX], int degree[MAX], int out_degree[MAX])
...{
    
while( *a && *b && *a == *b )
    
...{
        a
++;
        b
++;
    }


    
if( *a && *b )
    
...{
        
// directed graph
        
// a <---- b ( a < b )
        int alpha_a = *a - 'A';
        
int alpha_b = *b - 'A';
        
if( adj[alpha_b][alpha_a] == 0 )
        
...{
            adj[alpha_b][alpha_a] 
= 1;
            degree[alpha_a]
++;
            degree[alpha_b]
++;
            out_degree[alpha_b]
++;
        }

    }

}


void topo_print( int adj[MAX][MAX], int degree[MAX], int out_degree[MAX] )
...{
    
int alphabets[MAX];
    
int alphabets_max = 0;

    
for( int i = 0; i < MAX; ++i )
    
...{
        
if( degree[i] )
        
...{
            alphabets[alphabets_max
++] = i;
        }

    }


    
// print in topo order
    for( int i = 0; i < alphabets_max; ++i )
    
...{
        
        
int alpha = -1;
        
for( int j = 0; j < alphabets_max; ++j )
        
...{
            
int current_alpha = alphabets[j];
            
if( out_degree[current_alpha] == 0 )
            
...{
                alpha 
= current_alpha;
                out_degree[current_alpha] 
= -1;
                putchar(alpha 
+ 'A');
                
                
break;
            }

        }


        
// fix out_degree
        for( int j = 0; j < alphabets_max; ++j )
        
...{
            
int current_alpha = alphabets[j];
            
if( adj[current_alpha][alpha] > 0 )
            
...{
                out_degree[current_alpha]
--;
                adj[current_alpha][alpha] 
= 0;
            }

        }

    }

}


int main(int argc, char *argv[])
...{
    
int adj[MAX][MAX];    
    
int out_degree[MAX];
    
int degree[MAX];
    
int n = 0;

    memset( adj, 
0, sizeof(adj) );
    memset( out_degree, 
0, sizeof(out_degree) );
    memset( degree, 
0, sizeof(degree) );

    
bool quit = false;

    
char *prev_str = new char[255];
    
char *current_str = new char[255];

    scanf(
"%s", prev_str);
    n
++;

    
while(!quit)
    
...{
        scanf(
"%s", current_str);
        
        
if( strcmp( current_str, "#" ) == 0 )
            quit 
= true;
        
else
        
...{
            n
++;

            compare_str( prev_str, current_str, adj, degree, out_degree );

            
// swap prev_str & current_str and use new current_str
            char *temp = prev_str;
            prev_str 
= current_str;
            current_str 
= temp;
        }

    }


    
if( n == 1 )
        putchar(prev_str[
0]);
    
else
        topo_print(adj, degree, out_degree);

    putchar(
' ');
    

    delete prev_str;
    delete current_str;

    
return 0;
}


上一篇:PHP使用zlib扩展实现页面GZIP压缩输出
下一篇:构建支持Master/Slave读写分离的数据库操作类
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号