P6190 NOI Online 入門組 魔法

2022-08-05 13:15:19 字數 1048 閱讀 2786

p6190 [noi online 入門組]魔法

題目描述

分析這道題要求的是從1到\(n\)的最短路,其中有\(k\)次機會可以將一條邊暫時的變為相反數,一條邊可以走無數次

注意到無數次這個比較奇怪的要求,也就是說可以不考慮重複,那麼設\(a_\)表示從\(i\)到\(j\)用\(k\)次魔法的最小值,那麼顯然\(a_=min(a_+a_)\),即把\(i\)到\(j\)分為兩段,那麼首先對於\(k=0\)的情況,可以直接floyd解決,對於\(k=1\)可以列舉所有的邊解決,然後我們就得到了一個矩陣m,我們顯然可以定義一種矩陣乘法\(a*b=min(a_+b_)\)符合我們上面推出來的轉移方程

那麼對於\(k\)的情況,即用矩陣快速冪求出\(m^k\)即可

**

#includeusing namespace std;

const int n=105;

struct node

a,b;

int n,m,k,edge[2505][3];

void input()

return;

}void prepare()

for(int i=1;i<=n;i++) b.matrix[i][i]=0;

for(int kk=1;kk<=m;kk++)

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

b.matrix[i][j]=min(b.matrix[i][j],min(a.matrix[i][j],a.matrix[i][edge[kk][0]]+a.matrix[edge[kk][1]][j]-edge[kk][2]));

// for(int i=1;i<=n;i++)

// return;

}node matrix_mul(node a,node b)

long long matrix_pow(node x,int y)

return tem.matrix[1][n];

}void work()

int main()