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()