您的位置:首页 > 其它

uva 544(kruskal 变形)

2014-02-05 17:39 295 查看
题意:在一张无向带权图中,求a-b的一条路经满足这条路径上的最小的边最大。

思路:仔细一看就能发现这不是最小瓶颈路的变形嘛,最小瓶颈路是让你求最大的边最小,这道题的意思就是反了一下,而且还是单组询问的。所以我们用kruskal先求最大生成树,然后第一次合并询问节点的边即为答案。

代码如下:

/**************************************************
* Author     : xiaohao Z
* Blog     : http://www.cnblogs.com/shu-xiaohao/ * Last modified : 2014-02-05 17:03
* Filename     : uva_544.cpp
* Description     :
* ************************************************/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define MP(a, b) make_pair(a, b)
#define PB(a) push_back(a)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<unsigned int,unsigned int> puu;
typedef pair<int, double> pid;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;

const int INF = 0x3f3f3f3f;
const double eps = 1E-6;
const int LEN = 1010;
int n, m, parent[LEN], st, ed;
map<string, int> mp;
struct edge{int fr, to, val;}e[LEN*LEN];

void init(){
mp.clear();
for(int i=0; i<LEN; i++) parent[i] = i;
}
int Find(int x){return parent[x]==x?x:parent[x] = Find(parent[x]);}
bool cmp(edge a, edge b){ return a.val > b.val;}

int kruskal()
{
sort(e, e+m, cmp);
for(int i=0; i<m; i++){
int pa = Find(e[i].fr), pb = Find(e[i].to);
if(pa == pb) continue;
parent[pa] = pb;
if(Find(st) == Find(ed)) return e[i].val;
}
}

int main()
{
//freopen("in.txt", "r", stdin);

char a[101], b[101], val;
int ia, ib, kase = 1;
while(scanf("%d%d", &n, &m)!=EOF){
init();
if(!n && !m) break;
int cnt = 0;
for(int i=0; i<m; i++){
scanf("%s%s%d", a, b, &e[i].val);
if(!mp.count(a))mp[a] = ia = cnt++;
else ia = mp[a];
if(!mp.count(b))mp[b] = ib = cnt++;
else ib = mp[b];
e[i].fr = ia, e[i].to = ib;
}
scanf("%s%s", a, b);
st = mp[a]; ed = mp[b];
int ans = kruskal();
printf("Scenario #%d\n", kase++);
printf("%d tons\n\n", ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: