| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
帮忙看看哪里错了,程序超容易理解,wa了一百遍阿一百遍。#include <cstdio>
#include <algorithm>
#include <memory.h>
using std::sort;
const int N = 201;
int p[N];
int rank[N];
int gold[N];
int store[N];
int n, m;
void init()
{
for(int i = 1; i <= n; i++)
p[i] = i;
memset(rank, 0x00, sizeof(rank));
}
int find_set(int x)
{
if(p[x] == x)
return x;
p[x] = find_set(p[x]);
return p[x];
}
void link(int x, int y)
{
if(rank[x] > rank[y])
{
p[y] = x;
gold[x] += gold[y];
store[x] += store[y];
}
else
{
p[x] = y;
if(rank[x] == rank[y])
rank[y]++;
gold[y] += gold[x];
store[y] += store[x];
}
}
void join(int x, int y)
{
link(find_set(x), find_set(y));
}
bool test()
{
for(int i = 1; i <= n; i++)
{
int r = find_set(i);
if(gold[r] > store[r])
return false;
}
return true;
}
struct Node
{
int x;
int y;
int d;
bool operator<(const Node &node) const
{
return d<node.d;
}
};
Node a[N*N];
int main()
{
while(true)
{
scanf("%d", &n);
if(!n)
break;
init();
int i;
for(i = 1; i <= n; i++)
scanf("%d", gold+i);
for(i = 1; i <= n; i++)
scanf("%d", store+i);
scanf("%d", &m);
int x, y, d;
for(i = 0; i < m; i++)
{
scanf("%d%d%d", &x, &y, &d);
a[i].x = x, a[i].y = y, a[i].d = d;
}
if(test())
{
printf("0\n");
continue;
}
sort(a, a+m);
i = 0;
do
{
join(a[i].x, a[i].y);
}while(!test() && ++i<m);
if(i >= m)
printf("No Solution\n");
else
printf("%d\n", a[i].d);
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator