NEUQ2020 實驗班 訓練001(1 5題)

2021-10-14 01:52:05 字數 4349 閱讀 2631

在帶權有向圖g中,求g中的任意一對頂點間的最短路徑問題,也是十分常見的一種問題。

解決這個問題的乙個方法是執行n次迪傑斯特拉演算法,這樣就可以求出每一對頂點間的最短路徑,執行的時間複雜度為o(n​3)。 而另一種演算法是由弗洛伊德提出的,時間複雜度同樣是o(n​3​​),但演算法的形式簡單很多。

在本題中,讀入乙個有向圖的帶權鄰接矩陣(即陣列表示),建立有向圖並使用floyd演算法求出每一對頂點間的最短路徑長度。

輸入的第一行包含1個正整數n,表示圖中共有n個頂點。其中n不超過50。

以後的n行中每行有n個用空格隔開的整數。對於第i行的第j個整數,如果大於0,則表示第i個頂點有指向第j個頂點的有向邊,且權值為對應的整數值;如果這個整數為0,則表示沒有i指向j的有向邊。 當i和j相等的時候,保證對應的整數為0。

共有n行,每行有n個整數,表示源點至每乙個頂點的最短路徑長度。

如果不存在從源點至相應頂點的路徑,輸出-1。對於某個頂點到其本身的最短路徑長度,輸出0。

請在每個整數後輸出乙個空格,並請注意行尾輸出換行。

40 3 0 1

0 0 4 0

2 0 0 0

0 0 1 0

0 3 2 1

6 0 4 7

2 5 0 3

3 6 1 0

簡單的資料結構中的floyd演算法的實現與應用,只是本題需要注意的兩個點是:1.在輸入資料時,要將那些不相鄰的鄰點的權值由0變成inf。2.在輸出資料時,應注意要將inf轉為-1以後再輸出。

floyd-傻子也能看懂的弗洛伊德演算法這個文章寫的真心不錯,大家閱讀之後應該會有所收益。

#include

using

namespace std;

intmain()

}}for(

int k =

1; k <= n; k++)}

}}for(

int i =

1; i <= n; i++

) cout<[j]<<

' ';

} cout<}return0;

}

給定乙個初始為空的棧和一系列壓棧、彈棧操作,請編寫程式輸出每次彈棧的元素。棧的元素值均為整數。

輸入第1行為1個正整數n,表示操作個數;接下來n行,每行表示乙個操作,格式為1 d或0。1 d表示將整數d壓棧,0表示彈棧。n不超過20000。

按順序輸出每次彈棧的元素,每個元素一行。若某彈棧操作不合法(如在棧空時彈棧),則對該操作輸出invalid。

在這裡給出一組輸入。例如:

71 1

1 2000

1 30

在這裡給出相應的輸出。例如:21

invalid

3只要記住棧的特點即可:先進後出,然後利用陣列模擬上題所說的過程即可!

擴充套件資料:

#include

using

namespace std;

intmain()

else

if(x==0)

else}}

return0;

}

給定乙個初始為空的佇列和一系列入隊、出隊操作,請編寫程式輸出每次出隊的元素。佇列的元素值均為整數。

輸入第1行為1個正整數n,表示操作個數;接下來n行,每行表示乙個操作,格式為1 d或0。1 d表示將整數d入隊,0表示出隊。n不超過20000。

按順序輸出每次出隊的元素,每個元素一行。若某出隊操作不合法(如在佇列空時出隊),則對該操作輸出invalid。

在這裡給出一組輸入。例如:

71 1

1 2000

1 30

在這裡給出相應的輸出。例如:12

invalid3**

與棧那個題一樣,其實棧和佇列都屬於線性表的一部分,但不同的是,棧是先進後出,佇列是先進先出,這個題可以用陣列模擬普通佇列過去,但建議大家可以嘗試用一下迴圈佇列去做這個題,因為迴圈佇列可以更好的利用系統的空間。

#include

using

namespace std;

intmain()

else

if(x==0)

else}}

return0;

}

我們已經知道了將n個整數按從小到大排序的氣泡排序法。本題要求將此方法用於字串序列,並對任意給定的k(輸入在第1行中給出n和k(1≤k輸出氣泡排序法掃瞄完第k遍後的中間結果序列,每行包含乙個字串。

6 2best

cateast

afree

daybest

acat

dayeast

free

直接把string型別看作int去做就可以,原理與數字的氣泡排序基本一致,只不過之前是定義整型陣列,而現在該題是需要我們定義為字串陣列!

#include

using

namespace std;

intmain()

for(

int i=

0;i}for

(int i=

0;i1;i++

) cout<;return0;

}

假設全校有最多40000名學生和最多2500門課程。現給出每個學生的選課清單,要求輸出每門課的選課學生名單。

輸入的第一行是兩個正整數:n(≤40000),為全校學生總數;k(≤2500),為總課程數。此後n行,每行包括乙個學生姓名(3個大寫英文本母+1位數字)、乙個正整數c(≤20)代表該生所選的課程門數、隨後是c個課程編號。簡單起見,課程從1到k編號。

順序輸出課程1到k的選課學生名單。格式為:對每一門課,首先在一行中輸出課程編號和選課學生總數(之間用空格分隔),之後在第二行按字典序輸出學生名單,每個學生名字佔一行。

10 5

zoe1 2 4 5

ann0 3 5 2 1

bob5 5 3 4 2 1 5

joe4 1 2

jay9 4 1 2 5 4

fra8 3 4 2 5

don2 2 4 5

amy7 1 5

kat3 3 5 4 2

lor6 4 2 4 1 5

1 4ann0

bob5

jay9

lor6

2 7ann0

bob5

fra8

jay9

joe4

kat3

lor6

3 1bob5

4 7bob5

don2

fra8

jay9

kat3

lor6

zoe1

5 9amy7

ann0

bob5

don2

fra8

jay9

kat3

lor6

zoe1

定義乙個結構體,包含學生的名字,選課數量,選課種類。

在輸入資料的同時,定義乙個陣列,對每門課的數量進行統計,方便在後面輸出

利用sort()函式,加上bool cmp()函式,使得結構體學生的姓名按照字典序進行排序,方便後續的輸出

輸出時,遍歷每乙個學生的每門課程,然後若有,則輸出該學生的名字。

#include

using

namespace std;

struct stu

;bool

cmp(stu x,stu y)

intmain()

;for

(int i=

0;isort

(a,a+n,cmp)

;for

(int i=

1;i<=m;i++)}

}}return0;

}

還沒研究透,有興趣的夥伴們可以看一下:

ac**:

#include

using

namespace std;

const

int maxn=

2e5+5;

vector st[maxn]

;pairint>> stu[maxn]

;int

main()

}sort

(stu+

1,stu+

1+n)

;for

(int i=

1;i<=n;i++)}

for(

int i=

1;i<=k;i++)}

return0;

}

實驗班echo小組申請

註明 因為csdn寫部落格需要審核,時間比較長 所以所以我們小組部落格換位址了 新部落格位址 小組名稱 echo 小組隊長 蔡元媛 暫定 小組成員 邢順凱,李雁南,蔡元媛,張立 祖榮 小組文化與成立目的 e代表internet ch代表change o word 地球是圓的 簡單來說就是一隊熱愛並且...

實驗班,夢想放飛的地方

記得在實驗班成立的那次儀式上,包老師在校 院系領導及實驗班35位成員面前做了一次很正式的發言,題目就是石油軟體實驗班 夢想放飛的地方,創辦這個實驗班,包老師在內心可能對這個實驗班的未來有乙個比較清晰的預計,但是,說實話,在底下的我們除了新鮮事物故有的新鮮感外,未來更多的是不確定。實驗班二年生活一晃就...

Ynoi 2011 競賽實驗班

目錄傳送門 奇妙的拼盤題。首先考慮沒有操作 1,4 我們可以怎麼做。將數字進行拆位,這樣可以按位做乙個 0,1 的字首和。這是 mathcal o n log v 的。如果加上操作 4 呢?可以利用 rm trie 樹,在插入的時候就會幫你排好序。具體而言,先將所有數字的原始值插入 rm trie ...