7-8 哈利·波特的考试 (25 分)(详解+思路分析)真香啊
一:題目:
哈利·波特要考試了,他需要你的幫助。這門課學(xué)的是用魔咒將一種動(dòng)物變成另一種動(dòng)物的本事。例如將貓變成老鼠的魔咒是haha,將老鼠變成魚的魔咒是hehe等等。反方向變化的魔咒就是簡單地將原來的魔咒倒過來念,例如ahah可以將老鼠變成貓。另外,如果想把貓變成魚,可以通過念一個(gè)直接魔咒lalala,也可以將貓變老鼠、老鼠變魚的魔咒連起來念:hahahehe。
現(xiàn)在哈利·波特的手里有一本教材,里面列出了所有的變形魔咒和能變的動(dòng)物。老師允許他自己帶一只動(dòng)物去考場,要考察他把這只動(dòng)物變成任意一只指定動(dòng)物的本事。于是他來問你:帶什么動(dòng)物去可以讓最難變的那種動(dòng)物(即該動(dòng)物變?yōu)楣げㄌ刈约簬サ膭?dòng)物所需要的魔咒最長)需要的魔咒最短?例如:如果只有貓、鼠、魚,則顯然哈利·波特應(yīng)該帶鼠去,因?yàn)槭笞兂闪硗鈨煞N動(dòng)物都只需要念4個(gè)字符;而如果帶貓去,則至少需要念6個(gè)字符才能把貓變成魚;同理,帶魚去也不是最好的選擇。
輸入格式:
輸入說明:輸入第1行給出兩個(gè)正整數(shù)N (≤100)和M,其中N是考試涉及的動(dòng)物總數(shù),M是用于直接變形的魔咒條數(shù)。為簡單起見,我們將動(dòng)物按1~N編號(hào)。隨后M行,每行給出了3個(gè)正整數(shù),分別是兩種動(dòng)物的編號(hào)、以及它們之間變形需要的魔咒的長度(≤100),數(shù)字之間用空格分隔。
輸出格式:
輸出哈利·波特應(yīng)該帶去考場的動(dòng)物的編號(hào)、以及最長的變形魔咒的長度,中間以空格分隔。如果只帶1只動(dòng)物是不可能完成所有變形要求的,則輸出0。如果有若干只動(dòng)物都可以備選,則輸出編號(hào)最小的那只。
輸入樣例:
6 11
3 4 70
1 2 1
5 4 50
2 6 50
5 6 60
1 3 70
4 6 60
3 6 80
5 1 100
2 4 60
5 2 80
輸出樣例:
4 70
二:思路分析:
多源點(diǎn)最短路徑,分析題目時(shí),如果不知從何下手 可以從數(shù)據(jù)入手 分析數(shù)據(jù)特征 比自己干推 要省點(diǎn)時(shí)間
三:上碼
//分析輸出 0 時(shí) 那是說明圖是不連通的 統(tǒng)計(jì)結(jié)點(diǎn)個(gè)數(shù) 不夠N則輸出0 (只帶1只動(dòng)物是不可能完成所有變形要求的); // 多源點(diǎn)最短路徑問題 ,從數(shù)據(jù)分析來看 帶4在去則 最長的路徑長度也就是 70,那么的話 如果我選擇1的話 那么 在他這個(gè)最短路徑當(dāng)中,最長的是 100 ,那么也就是說 //求出所有點(diǎn) 當(dāng)中最長的那個(gè)路徑長度進(jìn)行比較,選擇最小的那個(gè)即是要選擇的結(jié)點(diǎn) 。如果有相同最小長度的結(jié)點(diǎn) 那么選擇其中編號(hào) 最小的 #include<bits/stdc++.h> using namespace std; #define infinite 99999int N,M; int cnt;//記錄訪問結(jié)點(diǎn)的個(gè)數(shù) typedef struct Graph* PtrGraph; typedef struct Graph {int Ne;int Nv;int Data[101][101]; }graph;void creatGraph(PtrGraph G) {int i,j,w;cin >> N >> M;G->Nv = N;G->Ne = M;for(int i = 1; i <= G->Nv; i++){for(int j = 1; j <= G->Nv; j++){G->Data[i][j] = infinite;//初始化 設(shè)置為無窮大 方便沒有鏈接的點(diǎn)表示距離if(i == j)G->Data[i][j] = 0; }}for(int k = 0; k < G->Ne; k++){cin >> i >> j >> w;G->Data[i][j] = w;G->Data[j][i] = w;} } //每次將其中的 最大值 返回 int dijkstra(PtrGraph G,int a,int vis[]) {int dist[101] = {0};int max = 0;vis[a] = 1;cnt++;for(int i = 1; i <= G->Nv; i++){dist[i] = G->Data[a][i];}while(1)//將剩余的結(jié)點(diǎn) 進(jìn)行多次求最小值;{ int m = -1;int min = infinite;for(int i = 1; i <= G->Nv; i++){if(dist[i] < min && vis[i] != 1){min = dist[i];m = i;}}if(m == -1)break;//證明已經(jīng)沒有最小的權(quán)值了 vis[m] = 1;//記錄已經(jīng)訪問過的cnt++;//記錄訪問的結(jié)點(diǎn)個(gè)數(shù)for(int i = 1; i <= G->Nv; i++){if( vis[i] != 1 && G->Data[m][i] + min < dist[i]){dist[i] = G->Data[m][i] + min;}}}for(int i = 1; i <= G->Nv; i++){//cout << dist[i] << ' ';if(dist[i] > max){max = dist[i]; // cout << dist[i] << ' ';}}return max;} int main() {PtrGraph G;int flag = 0;vector<int>v;int min = 1000,array[101],k = 1;G = (PtrGraph)malloc(sizeof(struct Graph));creatGraph(G);int a = 1;v.push_back(a);//vector容器的下標(biāo) 是從0開始 我們想要的是從1開始for(int i = 1; i <= G->Nv && flag ==0; i++){cnt = 0;int visited[101] = {0};int temp = dijkstra(G,i,visited);array[k++] = temp;v.push_back(temp);//這里vector容器的下標(biāo) 是從1開始if(cnt != N){flag = 1;}}if( flag == 1)cout << "0" << endl;else{sort(v.begin()+1,v.end());for(int i = 1; i <= k; i++){if(array[i] == v[1]){if( i < min )min = i;}}cout << min << ' ' << v[1] << endl;}}總結(jié)
以上是生活随笔為你收集整理的7-8 哈利·波特的考试 (25 分)(详解+思路分析)真香啊的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-7 六度空间 (30 分)(BFS遍
- 下一篇: 文件的创建与读取 文件的数据添加