51Nod 1445 變色DNA 最短路變形)

2021-09-28 15:33:32 字數 2879 閱讀 9301

有乙隻特別的狼,它在每個夜晚會進行變色,研究發現它可以變成n種顏色之一,將這些顏色標號為0,1,2...n-1。研究發現這只狼的基因中存在乙個變色矩陣,記為colormap,如果colormap[i][j]='y'則這只狼可以在某乙個夜晚從顏色i變成顏色j(一晚不可以變色多次),如果colormap[i][j]=『n』則不能在乙個晚上從i變成j色。進一步研究發現,這只狼每次變色並不是隨機變的,它有一定策略,在每個夜晚,如果它沒法改變它的顏色,那麼它就不變色,如果存在可改變的顏色,那它變為標號盡可能小的顏色(可以變色時它一定變色,哪怕變完後顏色標號比現在的大)。現在這只狼是顏色0,你想讓其變為顏色n-1,你有一項技術可以改變狼的一些基因,具體說你可以花費1的代價,將狼的變色矩陣中的某乙個colormap[i][j]='y'改變成colormap[i][j]='n'。問至少花費多少總代價改變狼的基因,讓狼按它的變色策略可以從顏色0經過若干天的變色變成顏色n-1。如果一定不能變成n-1,則輸出-1.

收起

多組測試資料,第一行乙個整數t,表示測試資料數量,1<=t<=5

每組測試資料有相同的結構構成:

每組資料第一行乙個整數n,2<=n<=50。

之後有n行,每行n個字元,表示狼的變色矩陣,矩陣中只有『y』與『n』兩種字元,第i行第j列的字元就是colormap[i][j]。

每組資料一行輸出,即最小代價,無解時輸出-1。
3

3nyn

ynynnn

8nnnnnnny

nnnnyyyy

ynnnnyyn

nnnnnyyy

yyynnnnn

ynynynyn

nynynyny

yyyyyyyn

6nyyyyn

ynyyyn

yynyyn

yyynyn

yyyynn

yyyyyn

1

0-1

題意就是讓你從 0 ------->  n-1,然後如果color[i][j] = "y"的話,就是可以從 i  到 j,但是有個條件就是如果color[i][p] 也等與「y",其中p比j小,那麼 i 就必須往p走,然後他有乙個能力就是把y變成n,其中花費為1。

思路:感覺這題挺有意思,就是建圖比較想。對於矩陣中 第 i行,到  某一值為y的點(color[i][j] = "y",j點)的權值其實是這一行前邊y的數量。然後依次建邊。求一遍最短路就行了。

有乙個突發狀況就是,為什麼spfa()過不了,而dijkstra()卻能過。。。

不對,我剛才spfa怎麼交都沒過,tm現在怎麼改都能過。。。

dijkstra;

ac code:

#include#include#include#include#include#include#includeusing namespace std;

#define read(x) scanf("%d",&x)

#define read(x,y) scanf("%d%d",&x,&y)

#define gc(x) scanf(" %c",&x);

#define mmt(x,y) memset(x,y,sizeof x)

#define write(x) printf("%d\n",x)

#define inf 0x3f3f3f3f

#define ll long long

#define mod 998244353

const int n = 100005;

char s[55][55];

int head[55],tot;

int d[55];

bool vis[55];

struct edge

edge[100000];

inline void add(int from,int to,int dis)

struct node

node(int a,int b):id(a),val(b){}

bool operator <(node a)const

};void dij()

); node tmp;

while(q.size()));}}

}}int main()

}dij();

if(d[n-1] == inf) puts("-1");

else coutac code:

#include#include#include#include#include#include#includeusing namespace std;

#define read(x) scanf("%d",&x)

#define read(x,y) scanf("%d%d",&x,&y)

#define gc(x) scanf(" %c",&x);

#define mmt(x,y) memset(x,y,sizeof x)

#define write(x) printf("%d\n",x)

#define inf 0x3f3f3f3f

#define ll long long

#define mod 998244353

const int n = 100005;

char s[55][55];

int head[55],tot;

int d[55];

bool vis[55];

struct edge

edge[n];

inline void add(int from,int to,int dis)

void spfa()}}

}}int main()}}

spfa();

if(d[n-1] == inf) puts("-1");

else cout<}

}

51NOD 1445 變色DNA 最短路

有乙隻特別的狼,它在每個夜晚會進行變色,研究發現它可以變成n種顏色之一,將這些顏色標號為0,1,2 n 1。研究發現這只狼的基因中存在乙個變色矩陣,記為colormap,如果colormap i j y 則這只狼可以在某乙個夜晚從顏色i變成顏色j 一晚不可以變色多次 如果colormap i j n...

51nod 1445 變色DNA 最短路

1445 變色dna 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 收藏關注有乙隻特別的狼,它在每個夜晚會進行變色,研究發現它可以變成n種顏色之一,將這些顏色標號為0,1,2.n 1。研究發現這只狼的基因中存在乙個變色矩陣,記為colormap,如果colorm...

51nod 1445 變色DNA(最短路變形)

借鑑了大佬的部落格 一 題目鏈結 題目大意 有乙隻特別的狼,它在每個夜晚會進行變色,研究發現它可以變成n種顏色之一,將這些顏色標號為0,1,2 n 1。研究發現這只狼的基因中存在乙個變色矩陣,記為colormap,如果colormap i j y 則這只狼可以在某乙個夜晚從顏色i變成顏色j 一晚不可...