| ||||||||||
| 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 | |||||||||
我是如此的SB……对自己无语了觉得题目不难,无向图,直接二分+并查集做了,用例也过了。。。然后WA,然后考虑有向图,用prim过了一次用例,WA。。。然后觉得自己对题目里的n点理解错了,不是一个点,而是每个点都要能到达的最大重,WA。。。然后看各种解题报告,确定还是无向图,并且感觉本来的理解和算法没错,再交了一遍,WA。。。直到最后怀疑是不是多用例情况下出错。。。果然,拿用例交两遍的结果是:
Scenario #2:
4
Scenario #2:
4
……原来把用例个数当用例序号输出了,败了……这个题的教训就是以后遇到多用例的题一定要拿多用例来测一下,以检测每个用例的初始化等问题。
最后附二分+并查的代码,200多ms
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Scenario;
int VN,ArcN;
int Start[1000005],End[1000005],Weight[1000005];
int ufs[1005];
int find(int x)
{
if(ufs[x]<0)
return x;
else
return ufs[x] = find(ufs[x]);
}
void setUnion(int r1,int r2)
{
if(ufs[r1]<ufs[r2])
{
ufs[r1] += ufs[r2];
ufs[r2] = r1;
}
else
{
ufs[r2] += ufs[r1];
ufs[r1] = r2;
}
}
void addConnection(int elem1,int elem2)
{
int r1 = find(elem1),r2 = find(elem2);
if( r1 != r2 )
setUnion(r1,r2);
}
bool connected(int elem1,int elem2)
{
int r1 = find(elem1),r2 = find(elem2);
return r1 == r2;
}
bool Good(int k)
{
int j;
memset(ufs,-1,sizeof(ufs));
for(j=1;j<=ArcN;++j)
{
if(Weight[j]>=k)
addConnection(Start[j],End[j]);
}
if( !connected(1,VN) )
return false;
else
return true;
}
int main()
{
int i,j;
int b,e,m;
scanf("%d",&Scenario);
for(i = 1;i<=Scenario;++i)
{
scanf("%d%d",&VN,&ArcN);
for(j=1;j<=ArcN;++j)
scanf("%d%d%d",&Start[j],&End[j],&Weight[j]);
b = 1;
e = 1000000;
while( b != e )
{
m = (b+e)/2;
if( Good(m) )
b = m + 1;
else
e = m;
}
if( Good(b) )
printf("Scenario #%d:\n%d\n\n",i,b);
else
printf("Scenario #%d:\n%d\n\n",i,b-1);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator