1. 程式人生 > >uva 10457(最小瓶頸路)

uva 10457(最小瓶頸路)

found clas color con 兩個 瓶頸 can ++ span

比賽的時候讀錯題了,賽後非要建最小生成樹然後dfs暴搜,有人告訴我不行,我還非要改一遍,改了一年,想明白了,不能保證下限,比如2,3,5能使兩個點連同,4,5也能的話,就不對了,想想我也是個鐵頭娃

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
const int maxv=200+10;
const int maxn=1000+100;
const int inf=0x3f3f3f3f
; int c[maxv]; int vis[maxv]; int maxcost[maxv][maxv]; int n,m,k; int s,t; int found(int x) { if(x==c[x]) return x; else return c[x]=found(c[x]); } bool same(int x,int y) { if(found(x)==found(y)) { return 1; } else return 0; } void unit(int x,int y) { x=found(x); y
=found(y); if(x==y) return; c[x]=y; } struct note { int u; int v; int len; bool operator <(const note &p) const { return len<p.len; } }aa[maxn]; void init() { for(int i=0;i<=n;i++) c[i]=i; } int main() { while(~scanf("%d%d",&n,&m)) { init();
for(int i=1;i<=m;i++) scanf("%d%d%d",&aa[i].u,&aa[i].v,&aa[i].len); sort(aa+1,aa+1+m); int nn,mm,k; scanf("%d%d",&nn,&mm); scanf("%d",&k); for(int i=1;i<=k;i++) { scanf("%d%d",&s,&t); int ans=inf; for(int i=1;i<=m;i++) { init(); for(int j=i;j<=m;j++) { if(!same(aa[j].u,aa[j].v)) { unit(aa[j].v,aa[j].u); if(same(s,t)) { ans=min(ans,aa[j].len-aa[i].len); break; } } } } printf("%d\n",ans+nn+mm); } } return 0; }

uva 10457(最小瓶頸路)