您的位置:首页 > 其它

uva11183 Teen Girl Squad(最小树形图)

2011-09-05 14:15 453 查看
ProblemI

TeenGirlSquad

Input:StandardInput
Output:StandardOutput
Timelimit:3.000seconds



--3springrollsplease.

--MSG'D!!

--Oh!Mystomachlining!

StrongBad
Youarepartofagroupofnteenagegirlsarmedwithcellphones.Youhavesomenewsyouwanttotelleveryoneinthegroup.Theproblemisthatnotwoofyouareinthesameroom,andyoumustcommunicateusingonlycellphones.What'sworse
isthatduetoexcessiveusage,yourparentshaverefusedtopayyourcellphonebills,soyoumustdistributethenewsbycallingeachotherinthecheapestpossibleway.Youwillcallseveralofyourfriends,theywillcallsomeoftheirfriends,andsoon
untileveryoneinthegrouphearsthenews.

Eachofyouisusingadifferentphoneserviceprovider,andyouknowthepriceofgirlAcallinggirlBforallpossibleAandB.Notallofyourfriendslikeeachother,andsomeofthemwillnevercallpeopletheydon'tlike.Yourjobistofindthecheapest
possiblesequenceofcallssothatthenewsspreadsfromyoutoalln-1othermembersofthegroup.

Input
Thefirstlineofinputgivesthenumberofcases,N(N<150).Ntestcasesfollow.Eachonestartswithtwolinescontainingn(0<=n<=1000)andm(0<=m<=
40,000).Girlsarenumberedfrom0ton-1,andyouaregirl0.Thenextmlineswilleachcontain3integers,u,vandw,meaningthatacallfromgirluto
girlvcostswcents(0<=w<=1000).Noothercallsarepossiblebecauseofgrudges,rivalriesandbecausetheyare,like,lame.Theinputfilesizeisaround1200KB.



Output

Foreachtestcase,outputonelinecontaining"Case#x:"followedbythecostofthecheapestmethodofdistributingthenews.Ifthereisnosolution,print"Possums!"instead.



SampleInputOutputforSampleInput

4

2

1

0110

2

1

1010

4

4

0110

0210

1320

2330

4

4

0110

1220

2030

23100

Case#1:10

Case#2:Possums!

Case#3:40

Case#4:130


Problemsetter:IgorNaverniouk

题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=65&page=show_problem&problem=2124

分析:这题也是最小树形图,而且边的权值范围不大,继续用基数排序优化,这个复杂度,又刷到Rank1.。。。

留念~~~

RankingSubmissionUserRunTimeLanguageSubmissionDate
19224799Pira0.028C++2011-09-0506:05:29
由此可见只要边权值范围小的,就用这个模板了。。。。

代码:

#include<cstdio>
usingnamespacestd;
constintmm=44444;
constintmn=1111;
structedge
{
ints,t,w;
}g[mm],h[mm];
inthead[mm],next[mm];
intp[mn],q[mn],mark[mn],fp[mn],from[mn],vis[mn],in[mn],w[mn],ans,sum;
inti,j,k,n,m,e,r,mw,t,cas=0;
boolhuan;
inlinevoidaddedge(intu,intv,doublec)
{
g[e].s=u,g[e].t=v,g[e].w=c,next[e]=head[u],head[u]=e++;
if(c>mw)mw=c;
}
voiddfs(intu)
{
++sum,vis[u]=1;
for(inti=head[u];i>=0;i=next[i])
if(!vis[g[i].t])dfs(g[i].t);
}
inlinevoidinit(int&a)
{
charch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
for(a=0;ch>='0'&&ch<='9';ch=getchar())a=a*10+ch-48;
}
voidmysort()
{
inti;
for(i=0;i<=n;++i)q[i]=0;
for(i=0;i<=mw;++i)p[i]=0;
for(i=0;i<e;++i)++q[g[i].t],++p[g[i].w];
for(i=1;i<=n;++i)q[i]+=q[i-1];
for(i=n;i>0;--i)q[i]=q[i-1];
q[0]=0;
for(i=1;i<=mw;++i)p[i]+=p[i-1];
for(i=mw;i>0;--i)p[i]=p[i-1];
p[0]=0;
for(i=0;i<e;++i)h[p[g[i].w]++]=g[i];
for(i=0;i<e;++i)g[q[h[i].t]++]=h[i];
}
intmain()
{
init(t);
while(t--)
{
init(n),init(m),--n;
for(i=e=mw=0;i<=n;++i)head[i]=-1;
while(m--)
{
init(i),init(j),init(k);
if(i!=j)addedge(i,j,k);
}
for(sum=i=0;i<=n;++i)vis[i]=0;
dfs(0);
if(sum<n+1)
{
printf("Case#%d:Possums!\n",++cas);
continue;
}
mysort();
for(i=0;i<=n;++i)fp[i]=p[i]=-1,in[i]=vis[i]=0,mark[i]=i;
for(i=0;i<e;++i)
if(p[g[i].t]<0)p[g[i].t]=i;
huan=1,ans=sum=0;
while(huan)
{
huan=0;
for(i=1;i<=n;++i)
if(fp[j=mark[i]]>=0)
{
if(fp[i]<0)in[i]+=w[j],mark[i]=mark[mark[i]];
else
{
in[i]+=w[i],ans+=w[i];
if(g[++p[fp[i]]].t!=fp[i])p[fp[i]]=-1;
}
}
for(i=0;i<=n;++i)fp[i]=-1,vis[i]=0;
for(i=1;i<=n;++i)
if(p[i]>=0)
{
if(fp[j=mark[i]]<0||(fp[j]>=0&&w[j]>g[p[i]].w-in[i]))
w[j]=g[p[i]].w-in[i],fp[j]=i,from[j]=mark[g[p[i]].s];
}
for(sum=0,i=1;i<=n;++i)
if(fp[i]>=0)sum+=w[i];
for(i=1;i<=n;++i)
if(!vis[i])
{
r=0,j=i;
while(j>0&&vis[j]>=0)
{
if(vis[j]>0)
{
huan=1;
while(q[--r]!=j)mark[q[r]]=j,vis[q[r]]=-1;
vis[j]=-1;
}
elseif(!vis[j])vis[q[r++]=j]=1;
if(fp[j]>=0)j=from[j];
elsej=-1;
}
while(r--)vis[q[r]]=fp[q[r]]=-1;
}
}
printf("Case#%d:%d\n",++cas,ans+sum);
}
return0;
}


普通版本1

#include<cstdio>
#include<cmath>
#definetypeint
usingnamespacestd;
constintmm=44444;
constintmn=1111;
constintoo=1000000000;
typec[mm],in[mn],ans;
ints[mm],t[mm],id[mn],pre[mn],q[mn];
typeDirected_MST(introot,intNV,intNE)
{
typeret=0;
inti,j,u,v,cnt,r;
while(1)
{
for(i=0;i<=NV;++i)in[i]=oo;
for(i=0;i<NE;++i)
if((u=s[i])!=(v=t[i])&&in[v]>c[i])
pre[v]=u,in[v]=c[i];
pre[root]=-1,in[root]=0;
for(i=1;i<=NV;++i)
if(in[i]==oo)return-1;
for(i=1;i<=NV;++i)id[i]=-1,ret+=in[i];
for(cnt=0,i=1;i<=NV;++i)
if(id[i]<0)
{
r=0,j=i;
while(j>=0&&id[j]<0)
{
if(id[j]==-2)
{
id[j]=++cnt;
while(q[--r]!=j)id[q[r]]=cnt;
}
elseid[q[r++]=j]=-2,j=pre[j];
}
while(r--)id[q[r]]=++cnt;
}
if(cnt==NV)break;
for(i=0;i<NE;++i)
{
j=t[i],s[i]=id[s[i]],t[i]=id[t[i]];
if(s[i]!=t[i])c[i]-=in[j];
}
NV=cnt;
root=id[root];
}
returnret;
}
intmain()
{
intn,m,e,T,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m),--n;
e=0;
while(m--)scanf("%d%d%d",&s[e],&t[e],&c[e]),e+=(s[e]!=t[e]);
ans=Directed_MST(0,n,e);
if(ans<0)printf("Case#%d:Possums!\n",++cas);
elseprintf("Case#%d:%d\n",++cas,ans);
}
return0;
}


普通版本2

#include<cstdio>
#include<cmath>
#definetypeint
usingnamespacestd;
constintmm=44444;
constintmn=1111;
typec[mm],in[mn],w[mn],ans;
ints[mm],t[mm],id[mn],pre[mn],q[mn],vis[mn];
typeDirected_MST(introot,intNV,intNE)
{
typeret=0,sum=0,tmp;
inti,j,u,v,r;
boolhuan=1;
for(i=0;i<=NV;++i)in[i]=0,id[i]=i,pre[i]=-1;
while(huan)
{
for(i=0;i<=NV;++i)
if(pre[j=id[i]]>=0)
{
if(pre[i]<0)in[i]+=w[j],id[i]=id[j];
elsein[i]+=w[i],ret+=w[i];
}
for(i=0;i<=NV;++i)pre[i]=-1,vis[i]=0;
for(i=0;i<NE;++i)
if((u=id[s[i]])!=(v=id[t[i]])&&(w[v]>(tmp=c[i]-in[t[i]])||pre[v]<0))
pre[v]=u,w[v]=tmp;
for(i=1;i<=NV;++i)
if(i!=root&&id[i]==i&&pre[i]<0)return-1;
for(pre[root]=-1,sum=i=0;i<=NV;++i)
if(pre[i]>=0)sum+=w[i];
for(i=huan=0;i<=NV;++i)
if(!vis[i])
{
r=0,j=i;
while(j>=0&&vis[j]>=0)
{
if(vis[j]>0)
{
while(q[--r]!=j)id[q[r]]=j,vis[q[r]]=-1;
huan=1,vis[j]=-1;
}
elsevis[q[r++]=j]=1,j=pre[j];
}
while(r--)vis[q[r]]=pre[q[r]]=-1;
}
}
returnret+sum;
}
intmain()
{
intn,m,e,T,cas=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m),--n;
e=0;
while(m--)scanf("%d%d%d",&s[e],&t[e],&c[e]),e+=(s[e]!=t[e]);
ans=Directed_MST(0,n,e);
if(ans<0)printf("Case#%d:Possums!\n",++cas);
elseprintf("Case#%d:%d\n",++cas,ans);
}
return0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: