51nod 1445 变色DNA ( Bellman-Ford算法求单源最短路径)
1445 變色DNA
基準(zhǔn)時(shí)間限制:1 秒 空間限制:131072 KB 分值: 40 難度:4級(jí)算法題
有一只特別的狼,它在每個(gè)夜晚會(huì)進(jìn)行變色,研究發(fā)現(xiàn)它可以變成N種顏色之一,將這些顏色標(biāo)號(hào)為0,1,2…N-1。研究發(fā)現(xiàn)這只狼的基因中存在一個(gè)變色矩陣,記為colormap,如果colormap[i][j]=’Y’則這只狼可以在某一個(gè)夜晚從顏色i變成顏色j(一晚不可以變色多次),如果colormap[i][j]=‘N’則不能在一個(gè)晚上從i變成j色。進(jìn)一步研究發(fā)現(xiàn),這只狼每次變色并不是隨機(jī)變的,它有一定策略,在每個(gè)夜晚,如果它沒法改變它的顏色,那么它就不變色,如果存在可改變的顏色,那它變?yōu)闃?biāo)號(hào)盡可能小的顏色(可以變色時(shí)它一定變色,哪怕變完后顏色標(biāo)號(hào)比現(xiàn)在的大)。現(xiàn)在這只狼是顏色0,你想讓其變?yōu)轭伾玁-1,你有一項(xiàng)技術(shù)可以改變狼的一些基因,具體說你可以花費(fèi)1的代價(jià),將狼的變色矩陣中的某一個(gè)colormap[i][j]=’Y’改變成colormap[i][j]=’N’。問至少花費(fèi)多少總代價(jià)改變狼的基因,讓狼按它的變色策略可以從顏色0經(jīng)過若干天的變色變成顏色N-1。如果一定不能變成N-1,則輸出-1.
Input
多組測試數(shù)據(jù),第一行一個(gè)整數(shù)T,表示測試數(shù)據(jù)數(shù)量,1<=T<=5
每組測試數(shù)據(jù)有相同的結(jié)構(gòu)構(gòu)成:
每組數(shù)據(jù)第一行一個(gè)整數(shù)N,2<=N<=50。
之后有N行,每行N個(gè)字符,表示狼的變色矩陣,矩陣中只有‘Y’與‘N’兩種字符,第i行第j列的字符就是colormap[i][j]。
Output
每組數(shù)據(jù)一行輸出,即最小代價(jià),無解時(shí)輸出-1。
Input示例
3
3
NYN
YNY
NNN
8
NNNNNNNY
NNNNYYYY
YNNNNYYN
NNNNNYYY
YYYNNNNN
YNYNYNYN
NYNYNYNY
YYYYYYYN
6
NYYYYN
YNYYYN
YYNYYN
YYYNYN
YYYYNN
YYYYYN
Output示例
1
0
-1
這題很暴力,不過要想通的一點(diǎn)是,cost[i][j] = 第i行j之前出現(xiàn)的‘Y’的數(shù)量。
然后求單源最短路徑即可,注意:求出為INF即為不可達(dá),輸出-1。
Bellman-Ford算法詳解:http://www.cnblogs.com/zhangjiuding/p/7712435.html
代碼:
#include <iostream> #include <algorithm> #include <map> #include <vector> using namespace std; typedef long long ll; #define INF 2147483647struct edge{int from,to,cost; };int t,n,E; edge es[2510]; int d[55];char color[55][55];//Bellman-Ford算法求單源最短路徑 void shortest_path(int s){fill(d,d+n,INF);d[s] = 0;while(true){bool update = false;for(int i = 0;i < E; i++){edge e = es[i];if(d[e.from] != INF && d[e.to] > d[e.from] + e.cost){d[e.to] = d[e.from] + e.cost;update = true;}}if(!update) break;} }int main(){cin >> t;while(t--){cin >> n;int f = 0;E = 0;for(int i = 0;i < n; i++){int cost = 0;for(int j = 0;j < n; j++){cin >> color[i][j];if(color[i][j] == 'Y'){es[E].from = i;es[E].to = j;es[E].cost = cost;cost++; E++;}}if(color[i][n-1] == 'Y') f = 1;}shortest_path(0);if(d[n-1] != INF)cout << d[n-1] <<endl;else cout << -1 << endl;}return 0; }總結(jié)
以上是生活随笔為你收集整理的51nod 1445 变色DNA ( Bellman-Ford算法求单源最短路径)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod 1307 绳子与重物 (标记
- 下一篇: 51nod 1785 数据流中的算法 (