/*
I think that this problem has a wrong problem statement,
since it needs to find second shortest path,
but in a case like there is many shortest path with cost x,
it wants to print smallest cost > x (even that there is another path to take).
That's just my opinion in this.
Here is a case:
3 3
0 1 1
1 2 1
0 2 2
1
0 2
We can consider this a shortest path: 0->1->2 with cost 2
However, this could be second shortest path: 0->2 with cost 2,
But the intended answer is 4 (0->1->0->2).
Solution:
Get all pairs shortest path using floyd warshall.
Then for every pair of nodes (a,b), iterate over all edges, check if this
edge is included in the second shortest path or not by calculating
distance between a and first point of this edge + cost of this edge
+ distance between second point of this edge and b,
and minimize answers of all edges that yield to a cost bigger than
shortest one.
Complexity: O(N*N*N + N*N*M + Q) for every test case.
*/
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 105;
int dist[MAXN][MAXN];
int secondDist[MAXN][MAXN];
int inf;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
memset(&inf,0x3f,4);
int T = 0;
int n,m;
while(cin>>n>>m)
{
T++;
cout<<"Set #"<<T<<"\n";
memset(dist,0x3f,sizeof dist);
memset(secondDist,0x3f,sizeof secondDist);
for(int i=0;i<n;i++)
dist[i][i] = 0;
vector<pair<int,int>> edges;
vector<int> costs;
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
dist[a][b] = c;// no multiple edges and no self loops
dist[b][a] = c;
edges.push_back({a,b});
edges.push_back({b,a});
costs.push_back(c);
costs.push_back(c);
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
int mn = inf;
for(int k=0;k<edges.size();k++)
{
int f = edges[k].first;
int t = edges[k].second;
int d = dist[i][f] + costs[k] + dist[t][j];
if(d>dist[i][j])
mn = min(mn,d);
}
secondDist[i][j] = mn;
}
int q;
cin>>q;
while(q--)
{
int f,t;
cin>>f>>t;
assert(secondDist[f][t] >= 0);
if(secondDist[f][t]!=inf)
cout<<secondDist[f][t]<<"\n";
else
cout<<"?\n";
}
}
return 0;
}
LyoKICAgIEkgdGhpbmsgdGhhdCB0aGlzIHByb2JsZW0gaGFzIGEgd3JvbmcgcHJvYmxlbSBzdGF0ZW1lbnQsCiAgICBzaW5jZSBpdCBuZWVkcyB0byBmaW5kIHNlY29uZCBzaG9ydGVzdCBwYXRoLAogICAgYnV0IGluIGEgY2FzZSBsaWtlIHRoZXJlIGlzIG1hbnkgc2hvcnRlc3QgcGF0aCB3aXRoIGNvc3QgeCwKICAgIGl0IHdhbnRzIHRvIHByaW50IHNtYWxsZXN0IGNvc3QgPiB4IChldmVuIHRoYXQgdGhlcmUgaXMgYW5vdGhlciBwYXRoIHRvIHRha2UpLgogICAgVGhhdCdzIGp1c3QgbXkgb3BpbmlvbiBpbiB0aGlzLgoKICAgIEhlcmUgaXMgYSBjYXNlOgogICAgMyAzCiAgICAwIDEgMQogICAgMSAyIDEKICAgIDAgMiAyCiAgICAxCiAgICAwIDIKCiAgICBXZSBjYW4gY29uc2lkZXIgdGhpcyBhIHNob3J0ZXN0IHBhdGg6IDAtPjEtPjIgd2l0aCBjb3N0IDIKICAgIEhvd2V2ZXIsIHRoaXMgY291bGQgYmUgc2Vjb25kIHNob3J0ZXN0IHBhdGg6IDAtPjIgd2l0aCBjb3N0IDIsCiAgICAgICAgQnV0IHRoZSBpbnRlbmRlZCBhbnN3ZXIgaXMgNCAoMC0+MS0+MC0+MikuCiAgICAgICAgCiAgICAgICAgCiAgICBTb2x1dGlvbjoKICAgIEdldCBhbGwgcGFpcnMgc2hvcnRlc3QgcGF0aCB1c2luZyBmbG95ZCB3YXJzaGFsbC4KICAgIFRoZW4gZm9yIGV2ZXJ5IHBhaXIgb2Ygbm9kZXMgKGEsYiksIGl0ZXJhdGUgb3ZlciBhbGwgZWRnZXMsIGNoZWNrIGlmIHRoaXMgCgllZGdlIGlzIGluY2x1ZGVkIGluIHRoZSBzZWNvbmQgc2hvcnRlc3QgcGF0aCBvciBub3QgYnkgY2FsY3VsYXRpbmcgCglkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGZpcnN0IHBvaW50IG9mIHRoaXMgZWRnZSArIGNvc3Qgb2YgdGhpcyBlZGdlCgkrIGRpc3RhbmNlIGJldHdlZW4gc2Vjb25kIHBvaW50IG9mIHRoaXMgZWRnZSBhbmQgYiwKCWFuZCBtaW5pbWl6ZSBhbnN3ZXJzIG9mIGFsbCBlZGdlcyB0aGF0IHlpZWxkIHRvIGEgY29zdCBiaWdnZXIgdGhhbiAKCXNob3J0ZXN0IG9uZS4KCiAgICBDb21wbGV4aXR5OiBPKE4qTipOICsgTipOKk0gKyBRKSBmb3IgZXZlcnkgdGVzdCBjYXNlLgoKKi8KCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE1BWE4gPSAxMDU7CgppbnQgZGlzdFtNQVhOXVtNQVhOXTsKaW50IHNlY29uZERpc3RbTUFYTl1bTUFYTl07CmludCBpbmY7CgppbnQgbWFpbigpCnsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKICAgIG1lbXNldCgmaW5mLDB4M2YsNCk7CiAgICBpbnQgVCA9IDA7CiAgICBpbnQgbixtOwogICAgd2hpbGUoY2luPj5uPj5tKQogICAgewogICAgICAgIFQrKzsKICAgICAgICBjb3V0PDwiU2V0ICMiPDxUPDwiXG4iOwogICAgICAgIG1lbXNldChkaXN0LDB4M2Ysc2l6ZW9mIGRpc3QpOwogICAgICAgIG1lbXNldChzZWNvbmREaXN0LDB4M2Ysc2l6ZW9mIHNlY29uZERpc3QpOwogICAgICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCiAgICAgICAgICAgIGRpc3RbaV1baV0gPSAwOwogICAgICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+PiBlZGdlczsKICAgICAgICB2ZWN0b3I8aW50PiBjb3N0czsKICAgICAgICBmb3IoaW50IGk9MDtpPG07aSsrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGEsYixjOwogICAgICAgICAgICBjaW4+PmE+PmI+PmM7CiAgICAgICAgICAgIGRpc3RbYV1bYl0gPSBjOy8vIG5vIG11bHRpcGxlIGVkZ2VzIGFuZCBubyBzZWxmIGxvb3BzCiAgICAgICAgICAgIGRpc3RbYl1bYV0gPSBjOwogICAgICAgICAgICBlZGdlcy5wdXNoX2JhY2soe2EsYn0pOwogICAgICAgICAgICBlZGdlcy5wdXNoX2JhY2soe2IsYX0pOwogICAgICAgICAgICBjb3N0cy5wdXNoX2JhY2soYyk7CiAgICAgICAgICAgIGNvc3RzLnB1c2hfYmFjayhjKTsKICAgICAgICB9CiAgICAgICAgZm9yKGludCBrPTA7azxuO2srKykKICAgICAgICAgICAgZm9yKGludCBpPTA7aTxuO2krKykKICAgICAgICAgICAgICAgIGZvcihpbnQgaj0wO2o8bjtqKyspCiAgICAgICAgICAgICAgICAgICAgZGlzdFtpXVtqXSA9IG1pbihkaXN0W2ldW2pdLCBkaXN0W2ldW2tdICsgZGlzdFtrXVtqXSk7CgogICAgICAgIGZvcihpbnQgaT0wO2k8bjtpKyspCiAgICAgICAgICAgIGZvcihpbnQgaj0wO2o8bjtqKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBtbiA9IGluZjsKICAgICAgICAgICAgICAgIGZvcihpbnQgaz0wO2s8ZWRnZXMuc2l6ZSgpO2srKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgZiA9IGVkZ2VzW2tdLmZpcnN0OwogICAgICAgICAgICAgICAgICAgIGludCB0ID0gZWRnZXNba10uc2Vjb25kOwogICAgICAgICAgICAgICAgICAgIGludCBkID0gZGlzdFtpXVtmXSArIGNvc3RzW2tdICsgZGlzdFt0XVtqXTsKICAgICAgICAgICAgICAgICAgICBpZihkPmRpc3RbaV1bal0pCiAgICAgICAgICAgICAgICAgICAgICAgIG1uID0gbWluKG1uLGQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2Vjb25kRGlzdFtpXVtqXSA9IG1uOwogICAgICAgICAgICB9CiAgICAgICAgaW50IHE7CiAgICAgICAgY2luPj5xOwogICAgICAgIHdoaWxlKHEtLSkKICAgICAgICB7CiAgICAgICAgICAgIGludCBmLHQ7CiAgICAgICAgICAgIGNpbj4+Zj4+dDsKICAgICAgICAgICAgYXNzZXJ0KHNlY29uZERpc3RbZl1bdF0gPj0gMCk7CiAgICAgICAgICAgIGlmKHNlY29uZERpc3RbZl1bdF0hPWluZikKICAgICAgICAgICAgICAgIGNvdXQ8PHNlY29uZERpc3RbZl1bdF08PCJcbiI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNvdXQ8PCI/XG4iOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==