在帶權有向圖g中,求g中的任意一對頂點間的最短路徑問題,也是十分常見的一種問題。
解決這個問題的乙個方法是執行n次迪傑斯特拉演算法,這樣就可以求出每一對頂點間的最短路徑,執行的時間複雜度為o(n3)。 而另一種演算法是由弗洛伊德提出的,時間複雜度同樣是o(n3),但演算法的形式簡單很多。
在本題中,讀入乙個有向圖的帶權鄰接矩陣(即陣列表示),建立有向圖並使用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 ...