1. 程式人生 > >NOIP複賽複習(五)程式對拍與圖論模板

NOIP複賽複習(五)程式對拍與圖論模板

程式對拍

所謂“對拍”,顧名思義,就是讓兩者相互比對。所謂“兩者”,一是你要測試的程式,二是一個答案在該程式在一定範圍(時間/空間)內結果必定正確的程式(一般是用暴力求解的程式)。對拍一般需要造資料程式(data.exe),保證正確性的暴力對拍程式(test.exe)與測試程式(以moo.exe為例)。下面是對拍的程式碼,寫在txt中再轉成.bat即可。

:loop

data.exe

test.exe

moo.exe

fc moo.out test.out

if %errorlevel% ==0goto loop

pause




圖論演算法

1、圖的遍歷-BFS

#include<iostream>

#include <queue>

#define N 5

using namespace std;

int maze[N][N] = {

    { 0, 1, 1, 0, 0 },

    { 0, 0, 1, 1, 0 },

    { 0, 1, 1, 1, 0 },

    { 1, 0, 0, 0, 0 },

    { 0, 0, 1, 1, 0 }

};

int visited[N + 1] = {0, };

void BFS(int start)

{

    queue<int> Q;

    Q.push(start);

    visited[start] = 1;

    while (!Q.empty())

    {

        int front = Q.front();

        cout << front << "";

        Q.pop();

        for (int i = 1; i <= N; i++)

        {

            if (!visited[i] &&maze[front - 1][i - 1] == 1)

            {

                visited[i] = 1;

                Q.push(i);

            }

        }

    }

}

int main()

{

    for (int i = 1; i <= N; i++)

    {

        if (visited[i] == 1)

            continue;

        BFS(i);

    }

    return 0;

}

 

2、圖的遍歷-DFS

#include<iostream>

#include <stack>

#define N 5

using namespace std;

int maze[N][N] = {

    { 0, 1, 1, 0, 0 },

    { 0, 0, 1, 0, 1 },

    { 0, 0, 1, 0, 0 },

    { 1, 1, 0, 0, 1 },

    { 0, 0, 1, 0, 0 }

};

int visited[N + 1] = {0, };

void DFS(int start)

{

    stack<int> s;

    s.push(start);

    visited[start] = 1;

    bool is_push = false;

    while (!s.empty())

    {

        is_push = false;

        int v = s.top();

        for (int i = 1; i <= N; i++)

        {

            if (maze[v - 1][i - 1] == 1&& !visited[i])

            {

                visited[i] = 1;

                s.push(i);

                is_push = true;

                break;

            }

        }

        if (!is_push)

        {

            cout << v << " ";

            s.pop();

        }

    }

}

int main()

{

    for (int i = 1; i <= N; i++)

    {

        if (visited[i] == 1)

            continue;

        DFS(i);

    }

    return 0;

}

 

3、最小生成樹-Kruskal

#include<cstdio>  

#include<iostream>  

using namespace std;  

const int MAXN = 30; 

int pa[MAXN];   

int rank[MAXN];    

int n,sum; 

struct node{  

    int x,y;  

    int w;  

}edge[MAXN*MAXN];  

bool cmp(node p,node q){  

    return p.w<q.w;  

}  

void make_set(int x)  

{  

    pa[x] = x;  

    rank[x] = 0;  

}  

int find_set(int x)  

{  

    if(x != pa[x])  

        pa[x] = find_set(pa[x]);  

    return pa[x];  

}  

void union_set(int x, int y,int w)  

{  

    x = find_set(x);  

    y = find_set(y);  

    if(x == y)return ;  

    if(rank[x] > rank[y])

    {  

        pa[y] = x;  

    }  

    else  

    {  

        pa[x] = y;  

        if(rank[x] == rank[y])  

            rank[y]++;  

    }  

    sum+=w;  

}  

int main()  

{  

  //  freopen("input.txt","r",stdin);  

    while(cin>>n){  

        if(!n) break;  

        char ch;  

        int m,k=0;  

        for (int i = 0; i < n - 1; i++)  

        {  

            cin >> ch >> m;  

相關推薦

NOIP複賽複習程式模板

程式對拍 所謂“對拍”,顧名思義,就是讓兩者相互比對。所謂“兩者”,一是你要測試的程式,二是一個答案在該程式在一定範圍(時間/空間)內結果必定正確的程式(一般是用暴力求解的程式)。對拍一般需要造資料程式(data.exe),保證正確性的暴力對拍程式(test.exe)與測試程式(以moo.e

NOIP複賽複習讀寫外掛高精度模板

讀入輸出掛 讀入輸出掛就是逐個字元地讀入資料,從而讓讀入更加快速。輸出掛的原理也是一樣的,都是通過將輸出數字變成輸出字元以加快速度。當然輸入輸出外掛一般用在大量輸入輸出的情況下,這樣價效比才高一些,否則得不償失。 void Rd(int &res){  &nbs

NOIP複賽複習檔案讀寫數論模板

檔案讀入讀出 假設題目名為“add”,那麼資料夾名為“add”,c++程式名為“add.cpp”,讀入檔名為“add.in”,輸出檔名為“add.out”。四個的拼寫均不可有誤,包括大小寫差異。千萬不要除錯後就忘記修改檔案讀入讀出了。  #include<cstdio&

NOIP複賽複習十三演算法鞏固提高

一、圖的儲存   1、鄰接矩陣   假設有n個節點,建立一個n×n的矩陣,第i號節點能到達第j號節點就將[i][j]標記為1(有權值標記為權值),  樣例如下圖:   /*無向圖,無權值*/ i

NOIP複賽複習怎樣才能拿到高分?

摘要 考場策略和程式測試是資訊學競賽中非常重要的環節,很多優秀的選手在很多比賽中總是會在這兩個環節上犯下這樣和那樣的錯誤,導致得到的分數和實力不成正比,最後留下了無盡的遺憾。本文將探討一些這兩個環節上值得注意的地方,提出一些可行的方法,分享一些經驗,以此希望幫助選手們在比賽中發揮水平,減少失

NOIP複賽複習如何設計測試資料?

有些同學參加一次資訊學比賽之後,自我感覺非常不錯,但是測評結果成績卻並不理想。造成這種情況的原因有多方面,但是我認為其中不可忽視的一大原因就是在寫完程式之後,他們並不知道如何保證程式的正確性。在這裡,我就這個問題提出一點自己的看法。 先從考試的時間分配問題講起。很多同學覺得考試時間很充分,N

NOIP複賽複習STL演算法樹結構模板

STL演算法 STL 演算法是一些模板函式,提供了相當多的有用演算法和操作,從簡單如for_each(遍歷)到複雜如stable_sort(穩定排序),標頭檔案是:#include <algorithm>。常用STL 演算法庫包括:sort快速排序演算法、二分

NOIP複賽複習STL容器字串模板

STL容器 STL 容器是一些模板類,提供了多種組織資料的常用方法。常用的STL容器包括pair(組合)、list(列表,類似於連結串列)、vector(向量,類似於陣列)、priority_queue(優先佇列)、set(集合)、map(對映)、stack(棧)等,通過模板的引數

NOIP複賽複習演算法分析排序模板

演算法分析 演算法分析的目的是預測演算法所需的資源,如計算時間(CPU 消耗)、記憶體空間(RAM 消耗)、通訊時間(頻寬消耗)等,以及預測演算法的執行時間,即在給定輸入規模時,所執行的基本運算元量,或者稱為演算法複雜度。 演算法的執行時間取決於輸入的資料特徵,輸入

NOIP複賽複習競賽環境注意事項

一、比賽不提供紙質試題,只提供電子版試題檔案。 該檔案壓縮包儲存在計算機桌面上。監考人公佈密碼後,選手自行解密試題。 試題解壓密碼會影響一個人的心情,一定要一次輸對,注意大小寫,不要邊輸入邊檢查,要對自己有自信。 二、江蘇複賽選手上機可自選windows或linux作業系統。

NOIP複賽複習常見問題常用策略

數學類問題 1. 精度處理(高精度、實數處理、各種浮點型別處理方法) 2. 組合數學問題(斐波那契數列、第二類數、卡特蘭數、Polya原理、排列組合計數、加法原理與乘法原理) 3. 進位制問題(特定二進位制串的統計、二分查詢、利用二進位制進行路徑、狀

NOIP複賽複習動態規劃鞏固提高

經典例題:數字金字塔(Luogu 1216)  寫一個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。 我們現在這裡討論搜尋如何實現:  狀態:目前在第x行第y列 

NOIP複賽複習十四字串演算法鞏固提高

一、Trie樹   1.定義: 通過字串建成一棵樹,這棵樹的節點個數一定是最少的。例如:4個字串"ab","abc","bd","dda"對應的trie樹如下: 其中紅色節點表示存在一個字串是以這個點結尾的。  一個性質:在樹上,兩個點u,

NOIP複賽複習十二數論演算法鞏固提高

一、數論    1.數   整數、自然數(大於等於0的整數)、正整數(大於0的整數)、負整數、非負整數、非正整數、非零整數、奇數偶數。   2.整除性   設a,b∈Z,如果存在c∈Z並且a=bc,則

NOIP複賽複習十一基礎演算法鞏固提高

一、倍增演算法:   定義:用f[i][j]表示從i位置出發的2j個位置的資訊綜合(狀態) 一個小小的問題:為什麼是2j而不是3j,5j,…?因為,假設為kj,整個演算法的時間複雜度為(k-1)logk,當k=2時,時間複雜度最小。 這個演算法的三個應用:

JavaSEJAVA象向上轉型和向下轉型

open 其他 解釋 編譯 -- 運行出錯 instance xtend args 今天做了一個測試的題目,發現自己還是很多問題沒有靜下心來做。很多問題是可以自己解決的但是自己一是沒有讀清題意,二是自己心裏太急躁了。所以這個要自己應以為鑒! 對象的轉型問題其實並不復雜,我

面向——面向象進階

isp ide -a lin t對象 lose att http lan 一、isinstance與issubclass方法 1、isinstance是用來判斷對象是否是某個類   isinstance(obj,class) 2、issubclass是用來判斷一個類是否為另

hibernate

資料庫中不能直接對映多對多 處理:建立一個橋接表(中間表),將一個多對多關係轉換成兩個一對多 hibernate可以直接對映多對多關聯關係(看作兩個一對多) 3. 多對多關係注意事項 3.1 一定要定義一個主控方 3.2 多對多刪除 3.2.1 主控方直接刪除

javaScript複習正則表示式RegExp

正則表示式(RegExp):專門規定字串中字元*格式規則*的表示式 1、最簡單的正則:一個關鍵詞的原文,就是最簡單的正則,如ABC 2、修飾符 i 執行對大小寫不敏感的匹配(無論大小寫都會匹配) g

TP框架複習

1、驗證碼的使用 1.1、快速入門 ①、建立方法 ②、模組內引入 同一模組、控制器下,直接呼叫該方法,也可設定路由規則,採用路由規則訪問驗證碼圖片。js動作實現點選切換驗證碼。 ③、檢視效果 1.2、自定義生成驗證碼 說明:關於驗證碼的原始碼