posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

USACO上的简单介绍,都快忘了各个术语的中文名了
graph
vertex 顶点 (pl. vertexes / vertices)
edge
edge-weighted 带权图(貌似中文是这么叫的吧)
weight
self-loop 自环
simple graph 简单图,不存在自环或两条(及以上)连接相同两点的边。multigraph 与之相对
degree
adjacent (to)
sparse graph 稀疏图,边数少于最大值(n*(n-1)/2)的图。与之相对的是dense graph。
(un)directed graph (有)无向图
out-degree in-degree 有向图顶点的出度/入度
path
cycle 回路

图的表示:
edge list
adjecency matrix
adjacency list
implict

连通性:
connected
component 连通分量
strongly connected component 强连通分量

subgraph 子图. The subgraph of G induced by V' is the graph (V', E')
bipartite 二分图
complete 任意两点间都有边

posted @ 2007-06-03 20:06 ZelluX 阅读(705) | 评论 (0)编辑 收藏

一开始什么优化都没有,过不了了(记得以前是可以的啊)
然后用了三个hash数组记录各列、对角线棋子的放置情况,再加上左右对称解的优化,总算在0.828秒里过了
/*
PROG: checker
ID: 06301031
LANG: C++
*/


#include 
<iostream>
#include 
<fstream>

using namespace std;

int g[13];
bool column[13], diag1[25], diag2[25];
int n;
int countResult = 0;
int mid = 0, firstHalf = 0;
ifstream fin(
"checker.in");
ofstream fout(
"checker.out");

void DFS(int t) {
    
int i;
    
if (t == n) {
        countResult
++;
        
if (countResult <= 3{
            fout 
<< g[0+ 1;
            
for (i = 1; i < n; i++{
                fout 
<< " " << g[i] + 1;
            }

            fout 
<< endl;
        }

        
return;
    }


    
for (g[t] = 0; g[t] < n; g[t]++{
        
if ((countResult > 3&& (t == 0)) {
            
if (g[t] == n / 2{
                firstHalf 
= countResult;
                
if (n % 2 == 0{
                    fout 
<< firstHalf * 2 << endl;
                    exit(
0);
                }

            }

            
if ((g[t] == n / 2 + 1&& (n % 2 == 1)) {
                mid 
= countResult - firstHalf;
                fout 
<< firstHalf * 2 + mid << endl;
                exit(
0);
            }

        }

        
if (column[g[t]]) {
            
continue;
        }

        
if (diag1[g[t] + t]) {
            
continue;
        }

        
if (diag2[g[t] - t + n]) {
            
continue;
        }


        diag1[g[t] 
+ t] = true;
        diag2[g[t] 
- t + n] = true;
        column[g[t]] 
= true;
        DFS(t 
+ 1);
        diag1[g[t] 
+ t] = false;
        diag2[g[t] 
- t + n] = false;
        column[g[t]] 
= false;

nextPosition:
        ;
    }

}


int main() {
    fin 
>> n;
    
int i;
    
for (i = 0; i < n; i++{
        column[i] 
= false;
    }

    
for (i = 0; i < n * 2 -1; i++{
        diag1[i] 
= false;
        diag2[i] 
= false;
    }

    DFS(
0);
    fout 
<< countResult << endl;
    fout.close();
    
return 0;
}

posted @ 2007-06-03 19:22 ZelluX 阅读(597) | 评论 (0)编辑 收藏

1. 关于函数指针
The C++ Programming Language上的一段示例代码:
map<string, int> histogram;

void record(const string& s)
{
histogram[s]++;
}

void print(const pair<const string, int>& r)
{
cout << r.first << ' ' << r.second << '\n\;
}

int main()
{
istream_iterator<string> ii(cin);
istream_iterator<string> eos;

for_each(ii, eos, record);
for_each(histogram.begin(), histogram.end(), print);
}

其中record和print是以函数指针的形式传递给for_each的。感觉这种方法最清晰、直接。
Java似乎更多的是用接口来达到类似的效果的,比如Collections.sort(Comparable),通常通过匿名内部类来进行自定义元素的比较,从而排序。但是这在语义上已经不是函数了,而是将被排序对象解释为实现了Comparable接口的对象。
另外Java反射机制中也有Mehod方法,觉得也可以通过传递Method类,然后在sort方法中调用这个Method的invoke方法,这应该更接近函数指针的语义。但没看到过这样的实例。
C#则引入了委托的概念,通过delegate关键字声明该方法。多一个关键字感觉就是啰唆了点。 -,-
现在开始对第一次在Thinking in Java中看到的Callback回调机制有了一点感觉。当时看的时候很难理解。
看来在学习某一门语言的时候有一定其他语言的背景进行比较,很容易加深理解。

2. 使用地址传递结构,减少开销
学C++最不适应的就是指针的应用,因为没有C的基础,尽管高中竞赛用的是Pascal,也用指针实现了trie、图的链式表示等比较复杂的数据结构,但是也没有像C++这样指针穿插在整个程序中的,当然C更多。
C++传递结构时默认是先复制一份拷贝,然后函数操作的是该拷贝,而不是Java中的传递引用(当然Java没有结构这一类型)。
C++ Primer Plus中指出要
1) 调用函数时传递地址&myStruct
2) 形参声明为指针MyStruct *
3) 访问成员使用操作符 ->

3. 将引用用于结构
同样,为了节省时空开销,在函数返回值时尽量使用引用。
const MyStruct & use(MyStruct & mystruct)
注意最好将返回的引用声明为const,否则可以使用这样的代码:
use(myStruct).used = 10;
容易产生语义混乱。
但在某些时候必须去掉const关键字。

posted @ 2007-06-03 18:58 ZelluX 阅读(356) | 评论 (0)编辑 收藏

算法:
进入大学后,对算法这些基础的看法改变了好几次。
高中里认为搞ACM没什么意义,觉得和应试差不多。
但是大学里有意无意的一些接触后,发现它涉及了大量应用数学的知识,对基础的提高十分有用。
保送的时候志愿填了数学系,不就是为了打好数学基础吗?
从功利的角度讲,有ACM的经历以后进IT公司自然可以方便不少。

英语:
从小学到高中,英语一直是强项,考试不需要突击,课本单词不需要刻意背诵,语言点很少复习,高中的英语考试让我对自己的英语过于自信了。
然后进了大学,处处受到强人的打击,上学期拿了B+觉得已经不错了。到现在这个英语班已经成为中等偏下的学生了,无论是词汇量还是听说能力。
sigh,暑假要报个补习班了。

至于其他的应用,asp.net ruby 之类的东西,权且当玩具学学吧,等需要应用的时候再好好看未必来不及,关键要有扎实的基础。

希望这个想法在放假前不会改变。

posted @ 2007-06-03 18:28 ZelluX 阅读(326) | 评论 (0)编辑 收藏

开始的方法太慢了,Superprime要从一位数开始生成,逐渐增加位数。


/*
PROG: sprime
ID: 06301031
LANG: C++
*/


#include 
<iostream>
#include 
<fstream>
#include 
<cmath>
#include 
<vector>
#include 
<algorithm>

using namespace std;

bool isPrime(long n) {
    
if (n == 1{
        
return false;
    }

    
for (int i = 2; i <= sqrt(n); i++{
        
if (n % i == 0{
            
return false;
        }

    }

    
return true;
}


int main() {
    ifstream fin(
"sprime.in");
    ofstream fout(
"sprime.out");
    
int n;
    fin 
>> n;
    
long i, j;
    
long base = 1;
    vector
<long> prev, now;
    vector
<long>::iterator iter;
    prev.push_back(
0);
    
for (i = 1; i <= n; i++{
        
for (j = 1; j <= 9; j++{

            
for (iter = prev.begin(); iter != prev.end(); iter++{
                
long number = *iter * 10 + j;
                
if (isPrime(number)) {
                    now.push_back(number);
                }

            }

        }

        prev 
= now;
        now.clear();
        
base *= 10;
    }


    sort(prev.begin(), prev.end());
    
for (iter = prev.begin(); iter != prev.end(); iter++{
        fout 
<< *iter << endl;
    }

}

posted @ 2007-06-01 22:32 ZelluX 阅读(248) | 评论 (0)编辑 收藏

最简单的DP,于是只用了一维数组稍微提高下难度,不过还是一次编译一次提交成功了,恩

/*
PROG: numtri
ID: 06301031
LANG: C++
*/


#include 
<iostream>
#include 
<fstream>

using namespace std;

int main() {
    ifstream fin(
"numtri.in");
    ofstream fout(
"numtri.out");
    
int n;
    fin 
>> n;
    
int i, j;
    
int f[1001];
    
for (i = 0; i <= n; i++{
        f[i] 
= 0;
    }

    
for (i = 0; i < n; i++{
        
for (j = 0; j <= i; j++{
            
int x;
            fin 
>> x;
            f[j] 
+= x;
        }

        
int temp[1001];
        
for (j = 0; j <= i; j++{
            temp[j] 
= f[j];
        }

        temp[i 
+ 1= f[i];
        
for (j = 0; j <= i; j++{
            
if (f[j] > temp[j + 1]) {
                temp[j 
+ 1= f[j];
            }

        }

        
for (j = 0; j <= i + 1; j++{
            f[j] 
= temp[j];
        }

    }


    
int max = 0;
    
for (i = 0; i <= n; i++{
        
if (f[i] > max) {
            max 
= f[i];
        }

    }

    fout 
<< max << endl;
    
return 0;
}

posted @ 2007-06-01 21:51 ZelluX 阅读(259) | 评论 (0)编辑 收藏

Packing Rectangles先cheat了,下星期再回来做。

先用筛法做了一张hash表,记录是否为素数,然后找各个素数判断是否为回文数,超内存了。。。
于是改为生成回文数后判断是否为素数,过了。
貌似现在写这种程序的速度比高中快不少了,到底是什么进步了呢?
/*
PROG: pprime
ID: 060301031
LANG: C++
*/


#include 
<iostream>
#include 
<fstream>
#include 
<bitset>
#include 
<cmath>

using namespace std;

bool isPrime(const long num) {
    
int i;
    
for (i = 2; i <= sqrt(num); i++{
        
if (num % i == 0{
            
return false;
        }

    }

    
return true;
}


int main() {
    ifstream fin(
"pprime.in");
    ofstream fout(
"pprime.out");
    
long from, to;
    
long i = 0, j;
    fin 
>> from >> to;
    
    
long beginNum = 1;
    
while (true{
        
int number;
        i
++;  // i indicates the digits of palindromes to be generated
        for (j = beginNum; j < beginNum * 10; j++{
            
long num1 = j, num2 = 0, temp = j;
            
if (i % 2 == 1{
                temp 
/= 10;
            }

            
while (temp > 0{
                num1 
*= 10;
                num2 
= num2 * 10 + (temp % 10);
                temp 
/= 10;
            }

            number 
= num1 + num2;
            
if (number > to) {
                
break;
            }

            
if (number < from) {
                
continue;
            }

            
if (isPrime(number)) {
                fout 
<< number << endl;
            }

        }

        
if (number > to) {
            
break;
        }

        
if (i % 2 == 0{
            beginNum 
*= 10;
        }

    }

    
return 0;
}

posted @ 2007-06-01 21:28 ZelluX 阅读(451) | 评论 (0)编辑 收藏

使用SQL登录验证:

1. 在SQL Server Management Studio Express中右击数据库,Properties -> Security,Server authentication选为SQL Server and Windows Authentication mode

2. 返回主界面,在Security的Login中增加用户,分配权限。

posted @ 2007-05-31 21:49 ZelluX 阅读(361) | 评论 (0)编辑 收藏

BFS,一次通过
/*
PROG: milk3
ID: 06301031
LANG: C++
*/


#include 
<iostream>
#include 
<fstream>
#include 
<deque>
#include 
<set>

using namespace std;

struct Status {
    
int a;
    
int b;
    
int c;
}
;

void pour(const int from, const int to, const int maxTo, int& newFrom, int& newTo) {
    newTo 
= from + to;
    newFrom 
= 0;
    
if (newTo > maxTo) {
        newFrom 
= newTo - maxTo;
        newTo 
= maxTo;
    }

}


int main() {
    
int i, j, k;
    ifstream fin(
"milk3.in");
    ofstream fout(
"milk3.out");
    Status begin;
    
int maxA, maxB, maxC;
    fin 
>> maxA >> maxB >> maxC;
    begin.a 
= 0;
    begin.b 
= 0;
    begin.c 
= maxC;
    
    
bool hash[21][21][21];
    
for (i = 0; i <= maxA; i++{
        
for (j = 0; j <= maxB; j++{
            
for (k = 0; k <= maxC; k++{
                hash[i][j][k] 
= false;
            }

        }

    }

    hash[
0][0][maxC] = true;
    
set<int> result;

    deque
<Status> queue;
    queue.push_back(begin);
    
while (!queue.empty()) {
        deque
<Status>::iterator now = queue.begin();
        
if (now->== 0{
            result.insert(now
->c);
        }

        Status newStat;
        newStat 
= *now;
        pour(now
->a, now->b, maxB, newStat.a, newStat.b);
        
if (!hash[newStat.a][newStat.b][newStat.c]) {
            hash[newStat.a][newStat.b][newStat.c] 
= true;   
            queue.push_back(newStat);
        }

        newStat 
= *now;
        pour(now
->b, now->a, maxA, newStat.b, newStat.a);
        
if (!hash[newStat.a][newStat.b][newStat.c]) {
            hash[newStat.a][newStat.b][newStat.c] 
= true;
            queue.push_back(newStat);
        }

        newStat 
= *now;
        pour(now
->c, now->a, maxA, newStat.c, newStat.a);
        
if (!hash[newStat.a][newStat.b][newStat.c]) {
            hash[newStat.a][newStat.b][newStat.c] 
= true;
            queue.push_back(newStat);
        }

        newStat 
= *now;
        pour(now
->a, now->c, maxC, newStat.a, newStat.c);
        
if (!hash[newStat.a][newStat.b][newStat.c]) {
            hash[newStat.a][newStat.b][newStat.c] 
= true;
            queue.push_back(newStat);
        }

        newStat 
= *now;
        pour(now
->b, now->c, maxC, newStat.b, newStat.c);
        
if (!hash[newStat.a][newStat.b][newStat.c]) {
            hash[newStat.a][newStat.b][newStat.c] 
= true;
            queue.push_back(newStat);
        }

        newStat 
= *now;
        pour(now
->c, now->b, maxB, newStat.c, newStat.b);
        
if (!hash[newStat.a][newStat.b][newStat.c]) {
            hash[newStat.a][newStat.b][newStat.c] 
= true;
            queue.push_back(newStat);
        }


        queue.pop_front();
    }


    
set<int>::iterator iter = result.begin();
    fout 
<< *iter;
    iter
++;
    
for (; iter != result.end(); iter++{
        fout 
<< " " << *iter;
    }

    fout 
<< endl;
    
return 0;
}

posted @ 2007-05-31 17:17 ZelluX 阅读(691) | 评论 (0)编辑 收藏

第一次做是用一张hash表记录的所有的数是否为所谓的bisquare,然后先枚举公差,再枚举首项,本来想这样做就不用再对结果排序了,没想到效率很低。
改为先枚举首项,再枚举第二项,然后计算公差后,速度提高不少。
另外第一次使用sort方法。
/*
PROG: ariprog
ID: 06301031
LANG: C++
*/


#include 
<iostream>
#include 
<fstream>
#include 
<vector>
#include 
<algorithm>

using namespace std;

struct Ans {
    
int start;
    
int step;
}
;

bool compareOp(const Ans& ans1, const Ans& ans2);

int main() {
    ifstream fin(
"ariprog.in");
    ofstream fout(
"ariprog.out");
    
int n, m, i, j, k;
    
bool solved = false;
    fin 
>> n >> m;

    
// generate Arithmetic Progressions sequence
    bool seq[250*250*2 + 1];    
    
for (i = 0; i <= m * m * 2; i++{
        seq[i] 
= false;
    }

    
for (i = 0; i <= m; i++{
        
for (int j = 0; j <= i; j++{
            seq[i
*+ j*j] = true;
        }

    }


    vector
<Ans> result;
    
int step;
    
for (i = 0; i <= m * m * 2; i++{
        
if (!seq[i]) {
            
continue;
        }

        
for (j = i + 1; j <= m * m * 2; j++{
            
if (!seq[j]) {
                
continue;
            }

            step 
= j - i;
            
if (i + step * (n - 1> m * m * 2{
                
break;
            }


            
bool flag = true;
            
for (k = 1; k < n; k++{
                
if (!seq[i + step * k]) {
                    flag 
= false;
                    
break;
                }

            }

            
if (flag) {
                Ans ans;
                ans.start 
= i;
                ans.step 
= step;
                result.push_back(ans);
                solved 
= true;
            }

        }

    }

    
if (!solved) {
        fout 
<< "NONE" << endl;
    }


    sort(result.begin(), result.end(), compareOp);
    vector
<Ans>::iterator iter;
    
for (iter = result.begin(); iter != result.end(); iter++{
        fout 
<< iter->start << " " << iter->step << endl;
    }

    fout.close();
    
return 0;
}


bool compareOp(const Ans& ans1, const Ans& ans2) {
    
return ans1.step < ans2.step;
}

posted @ 2007-05-30 22:18 ZelluX 阅读(626) | 评论 (0)编辑 收藏

仅列出标题
共39页: First 上一页 23 24 25 26 27 28 29 30 31 下一页 Last