本人用交叉相乘判断,结果就 WA 了,求助大佬。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x7f7f7f7f;
const ll mxn = 500, mxm = 5e3;
const ll N = mxn + 10, M = mxm + 10;
ll n, m, bgn, nd, ans_min, ans_max, f[N];
struct node { ll x, y, v; } a[M];
ll get_fa(ll x) { if(x == f[x]) return x; return f[x] = get_fa(f[x]); }
void merge(ll x, ll y) { ll fx = get_fa(x), fy = get_fa(y); if(fx ^ fy) f[fx] = fy; }
ll gcd(ll x, ll y) { ll z = x % y; while(z) x = y, y = z, z = x % y; return y; }
bool cmp(node x, node y) { return x.v < y.v; }
void init() { for(ll i = 1; i <= n; ++ i) f[i] = i; }
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
for(ll i = 1; i <= m; ++ i) cin >> a[i].x >> a[i].y >> a[i].v;
cin >> bgn >> nd; ans_min = 0, ans_max = INF;
sort(a + 1, a + m + 1, cmp);
for(ll i = 1; i <= m; ++ i) {
init();
for(ll j = i; j <= m; ++ j) {
merge(a[j].x, a[j].y);
if(get_fa(bgn) == get_fa(nd)) {
if(a[j].v * ans_min < a[j].v * ans_max) ans_min = a[i].v, ans_max = a[j].v;
break;
}
}
}
if(ans_min == 0 && ans_max == INF) cout << "IMPOSSIBLE\n";
else if(ans_max % ans_min == 0) cout << ans_max / ans_min << '\n';
else cout << ans_max / gcd(ans_max, ans_min) << '/' << ans_min / gcd(ans_max, ans_min) << '\n';
return 0;
}
不明白的是判断时换成小数就 AC 了。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x7f7f7f7f;
const ll mxn = 500, mxm = 5e3;
const ll N = mxn + 10, M = mxm + 10;
ll n, m, bgn, nd, ans_min, ans_max, f[N]; double ans;
struct node { ll x, y, v; } a[M];
ll get_fa(ll x) { if(x == f[x]) return x; return f[x] = get_fa(f[x]); }
void merge(ll x, ll y) { ll fx = get_fa(x), fy = get_fa(y); if(fx ^ fy) f[fx] = fy; }
ll gcd(ll x, ll y) { ll z = x % y; while(z) x = y, y = z, z = x % y; return y; }
bool cmp(node x, node y) { return x.v < y.v; }
void init() { for(ll i = 1; i <= n; ++ i) f[i] = i; }
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
for(ll i = 1; i <= m; ++ i) cin >> a[i].x >> a[i].y >> a[i].v;
cin >> bgn >> nd; ans_min = 0, ans_max = INF, ans = 0;
sort(a + 1, a + m + 1, cmp);
for(ll i = 1; i <= m; ++ i) {
init();
for(ll j = i; j <= m; ++ j) {
merge(a[j].x, a[j].y);
if(get_fa(bgn) == get_fa(nd)) {
double tmp = 1.0 * a[i].v / a[j].v;
if(tmp > ans) ans_min = a[i].v, ans_max = a[j].v, ans = tmp;
break;
//改动处
}
}
}
if(ans_min == 0 && ans_max == INF) cout << "IMPOSSIBLE\n";
else if(ans_max % ans_min == 0) cout << ans_max / ans_min << '\n';
else cout << ans_max / gcd(ans_max, ans_min) << '/' << ans_min / gcd(ans_max, ans_min) << '\n';
return 0;
}
大佬们救我!!!