這道題,的確是個一眼題。。。。
除了離散化不想說什麼。
最開始的時候發現這題的輸入很坑,它給的點的編號不是連續的,也就是說雖然最多只有100個點但點的編號可能會很大,那就只能離散化了,最開始用的去重+二分,調了半天不對,發現這很麻煩,於是換了一種,點的編號沒什麼用,除了當乙個標記之外,不需要維護相對大小,所以直接用乙個數字代替就好,後來發現最開始的離散化求去重後陣列長度寫錯了。。。
至於這道題怎麼做,我真的懶得說了。請參考乙個月前寫的東西:
noi online魔法
如果沒什麼思路,這裡還有個ppt。(感覺如果很久前我分享的時候聽的認真的同志應該都能做出來。。)
ppt算了,我還是良心點寫幾句吧。
這道題的樸素做法是什麼?外層迴圈\(1~n\),對整張圖鬆弛\(n\)次,這個應該比較好理解,但對於這道題來說行不通,因為\(n\)真的太大了,肯定會t,所以要用乙個更珂學的手段,矩陣快速冪。
對於乙個矩陣\(a\),\(a^k\)就表示它在當前定義下的第\(k\)次狀態,放到這道題來說就是經過\(k\)條路之後的最短路,直接乘\(k\)次還是會t,用快速冪加一下速就行,這樣乘的時間複雜度就會很小,因為最多隻乘32次,這道題可能還到不了。
還有,終點\(e\)這個變數千萬不要寫小寫的,因為邊也是用\(e\)存的,用\(edge\)的自行忽略,我因為這個ce了半天
n--又是怎麼回事呢?不memcpy的話就不用,因為我cpy過去就已經是走一條邊的最短路了,不cpy的話就是零條邊
#include#include#includeusing namespace std;
const int n=1e2+10;
int t,dis[n][n],f[n][n];
struct edgee[n<<1];
int tt,que[n*n*n];
void mul(int a[n][n],int b[n][n],int c[n][n])
int main()
memcpy(dis,f,sizeof(f));
n--;
while(n)
mul(f,f,f);
n>>=1;
}printf("%d\n",dis[que[s]][que[e]]);
}
POJ 3613 Floyd 矩陣快速冪
題意 傳送門 poj 3613 cow relays 題解設從 u uu 出發,到 v vv 的長度為 k kk 的最短路徑為 gk u v g k u v gk u v 修改 flo yd floyd floy d 演算法,則有 g k1 k2 u v min 1 w v gk1 u w gk 2...
POJ 3613 Floyd的思想 矩陣乘法
題目描述抽象來看,是指有乙個有向圖,問乙個點經過n條邊到另乙個點的最短距離 邊可重複走 為了搞這題.去研究了下矩陣乘法.我不是計算機專業 又看了下他們的離散數學教材.有乙個例子是說求兩點間經過n條邊到達的方案數.mtrix67的blog的第八題講的也是這個問題.首先看經過n條邊方案數的這個問題.也就...
構造矩陣 矩陣快速冪 POJ3735
這題題意如下,有n 只貓咪,三種關於花生的命令 得花生,吃花生,交換花生 給出一套命令,重複 n 次,問最後每只貓咪得到多少花生。m那麼大,毫無疑問,矩陣快速冪。先構造乙個單位矩陣,因為只需在單位矩陣上進行操作,然後用操作完之後得到的矩陣乘以初始的狀態就得到最終的狀態。看下圖 第 i 只貓咪得花生就...