/*<br />對於這個問題我不想說什麼,感覺ACM太神奇在這裡檢討以下,好久沒有寫並查集都很生疏了<br />話說學的多也不能忘的快。。。在最短路的DIY中總感覺要用Dijsktra</p><p>http://hi.baidu.com/yzy%D1%EE%D7%D3%D1%DC/blog/item/829095fd6c14b58eb901a0a3.html</p><p>find the most comfortable road</p><p>http://acm.hdu.edu.cn/showproblem.php?pid=1598</p><p>題目大意:從一個地方到另外一個地方所經過的路的最大速度和最小速度的差值。這題太好了。<br />剛開始總以為是最短路問題,用個Floyd應該可以做出來,用兩個矩陣,分別記錄最大值和最小值,不過很難弄,結果也只有WA,感到很莫名奇妙。<br />對於題目中的路,按速度進行排序,這樣,如果從第 i 條路到第 j 條路之間的所有路能夠讓 i 和 j 連通,那麼,這就存在一條路,且這條路的舒適度就是 兩者的差值。<br />這樣,只要枚舉從每一條路開始,向前找到可以使得 起點和終點連通的路的舒適度,就可以找到答案了</p><p>*/<br />#include <iostream><br />#include <queue><br />#include <cstdio><br />#include <algorithm><br />using namespace std;</p><p>const int INF = 0x3fffffff;<br />const int N = 2010;<br />struct node<br />{<br />int x;<br />int y;<br />int dis;<br />friend bool operator <(node a, node b)<br />{<br />return a.dis < b.dis;<br />}<br />}df[N];</p><p>int st[N];<br />int cost[N];<br />bool hash[N];</p><p>int find(int a)<br />{//這裡可以狀態壓縮,可是具體怎樣不會。<br />int r = a;<br />while(st[r] != r)<br />r = st[r];<br />//st[a] = r;<br />return r;<br />}</p><p>void merge(int a, int b)<br />{<br />if(a > b)<br />st[b] = a;<br />else<br />st[a] = b;<br />}</p><p>int main()<br />{<br />int n, m;<br />while(scanf("%d %d", &n, &m) != EOF)<br />{<br />for(int i = 0; i < m; i++)<br />{<br />scanf("%d %d %d", &df[i].x, &df[i].y, &df[i].dis);<br />}<br />sort(df, df + m);<br />//for(int i = 0; i < m; i++)<br />//printf("%d ", df[i].dis);<br />/*<br />for(int i = 0; i < m; i++)<br />{<br />int a = find(df[i].x);<br />int b = find(df[i].y);<br />if( a != b)<br />merge(a, b);<br />}<br />*/<br />int q;<br />scanf("%d", &q);<br />int start, end;<br />while(q--)<br />{<br />scanf("%d %d", &start, &end);<br />int min = INF;<br />int j;<br />for(int i = m - 1; i >= 0; i--)<br />{<br />for(j = 0; j <= n; j++)<br />st[j] = j;<br />j = i;<br />while(j >= 0)<br />{<br />int a = find(df[j].x);<br />int b = find(df[j].y);<br />if( a != b)<br />merge(a, b);<br />if(find(start) == find(end))<br />break;<br />j--;<br />}<br />if(j < 0)<br />break;<br />if(min > df[i].dis - df[j].dis)<br />min = df[i].dis - df[j].dis;</p><p>}<br />if(min == INF)<br />min = -1;<br />printf("%d/n", min);</p><p>}<br />}<br />}