`
promiser
  • 浏览: 76634 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

bzoj1050: [HAOI2006]旅行comf

    博客分类:
  • oi
 
阅读更多

先把边按边权从大到小排,O(M^2)枚举边的区间,并查集判断S和T是否连通,若联通则更新答案

const int N = 510, M = 5010;
typedef pair<int, pair<int, int> > PIII;
PIII Edge[M];
int Fa[N], n, m, S, T;
int Rate1, Rate2;

inline void Input() {
	scanf("%d%d", &n, &m);
	For(i, 1, m) scanf("%d%d%d", &Edge[i].sd.ft, &Edge[i].sd.sd, &Edge[i].ft);
	sort(Edge + 1, Edge + 1 + m);
	scanf("%d%d", &S, &T);
}

inline int gcd(int A, int B) {
	if(!B) return A;
	else return gcd(B, A % B);
}
inline void UpDat(int A, int B) {
	int Gcd;
	Gcd = gcd(A, B);
	A /= Gcd, B /= Gcd;
	
	if((LL)Rate1 * B > (LL)Rate2 * A) Rate1 = A, Rate2 = B;
	
	Gcd = gcd(Rate1, Rate2);
	Rate1 /= Gcd, Rate2 /= Gcd;
}
inline int Get(int x) {
	if(Fa[x] != x) return Fa[x] = Get(Fa[x]);
	else return x;
}
inline void Solve() {
	Rate1 = INF, Rate2 = 1;
	Ford(l, m, 1) {
		For(i, 1, n) Fa[i] = i;
		Ford(r, l, 1) {
			int u = Edge[r].sd.ft, v = Edge[r].sd.sd;
			Fa[Get(u)] = Get(v);
			if(Get(S) == Get(T)) {
				UpDat(Edge[l].ft, Edge[r].ft);
				break;
			}
		}
	}
	UpDat(INF, 1);
	
	if(Rate2 == 1) {
		if(Rate1 >= INF) puts("IMPOSSIBLE");
		else printf("%d\n", Rate1);
	} else printf("%d/%d\n", Rate1, Rate2);
}

int main() {
    #ifndef ONLINE_JUDGE
    SETIO("1050");
    #endif
    Input();
    Solve();
    return 0;
}

 

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics