您的位置:首页 > 其它

HDU 3047 并查集

2013-08-13 20:38 330 查看

ZjnuStadium

ProblemDescriptionIn12thZhejiangCollegeStudentsGames2007,therewasanewstadiumbuiltinZhejiangNormalUniversity.Itwasamodernstadiumwhichcouldholdthousandsofpeople.TheaudienceSeatsmadeacircle.Thetotalnumberofcolumnswere300numbered1--300,countedclockwise,weassumethenumberofrowswereinfinite.Thesedays,Busoniyawanttoholdalarge-scaletheatricalperformanceinthisstadium.TherewillbeNpeoplegotherenumbered1--N.BusoniyahasReservedseveralseats.Tomakeitfunny,hemakesMrequestsfortheseseats:ABX,whichmeanspeoplenumberedBmustseatclockwiseXdistancefrompeoplenumberedA.Forexample:Aisincolumn4thandXis2,thenBmustincolumn6th(6=4+2).Nowyourtaskistojudgeweathertherequestiscorrectornot.Theruleofyourjudgementiseasy:whenanewrequesthasconflictsagainsttheforegoingonesthenwedefineitasincorrect,otherwiseitiscorrect.PleasefindoutalltheincorrectrequestsandcountthemasR.InputTherearemanytestcases:Foreverycase:ThefirstlinehastwointegerN(1<=N<=50,000),M(0<=M<=100,000),separatedbyaspace.ThenMlinesfollow,eachlinehas3integerA(1<=A<=N),B(1<=B<=N),X(0<=X<300)(A!=B),separatedbyaspace.OutputForeverycase:OutputR,representsthenumberofincorrectrequest.SampleInput
1010
12150
34200
15270
26200
6580
47150
89100
4850
17100
92100
SampleOutput
2
Hint
Hint:
(PS:the5thand10threquestsareincorrect)
其实不是很理解..
#include<iostream>usingnamespacestd;intp[1111111],dis[1111111];intcnt;intfind(intx){if(x==p[x])returnx;intaa=p[x];p[x]=find(p[x]);dis[x]+=dis[aa];returnp[x];}voidmerge(inta,intb,intc){intx=find(a),y=find(b);if(x==y&&dis[b]-dis[a]!=c)cnt++;if(x!=y){p[y]=x;dis[y]=dis[a]+c-dis[b];}}intmain(){intn,m,i,j,k,a,b,c;while(~scanf("%d%d",&n,&m)){cnt=0;memset(dis,0,sizeof(dis));for(i=1;i<=n;i++)p[i]=i,dis[i]=0;while(m--){scanf("%d%d%d",&a,&b,&c);merge(a,b,c);}printf("%d\n",cnt);}return0;}

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