您的位置:首页 > 其它

UVA-11183- Teen Girl Squad(最小树形图模板)

2017-02-21 18:08 441 查看
题目链接:UVA-11183- Teen Girl Squad

最小树形图,套模板即可。

#include<bits/stdc++.h>
using namespace std;
const int INF=1e9+7;
int n,m;
struct Edge{
int u,v,d;
};
Edge edges[40007];
int in[1007],vis[1007],id[1007],pre[1007];
int zhuliu(int rt)
{
int res=0;
while(1)
{
//找最小入边
for(int i=0;i<n;i++)    in[i]=INF;
for(int i=0;i<m;i++)
{
if(edges[i].u!=edges[i].v&&edges[i].d<in[edges[i].v])
in[edges[i].v]=edges[i].d,pre[edges[i].v]=edges[i].u;
}
for(int i=0;i<n;i++)
if(i!=rt&&in[i]==INF)   return INF;
//找环
memset(vis,-1,sizeof(vis));
memset(id,-1,sizeof(id));
int tn=0;
in[rt]=0;
for(int i=0;i<n;i++)
{
res+=in[i];
int u=i;
while(rt!=u&&id[u]==-1&&vis[u]!=i)
{
vis[u]=i;
u=pre[u];
}
if(rt!=u&&id[u]==-1)
{
for(int v=pre[u];v!=u;v=pre[v]) id[v]=tn;
id[u]=tn++;
}
}
if(tn==0)   break;
for(int i=0;i<n;i++)    if(id[i]==-1)   id[i]=tn++;
for(int i=0;i<m;)
{
int v=edges[i].v;
edges[i].u=id[edges[i].u];
edges[i].v=id[edges[i].v];
if(edges[i].u!=edges[i].v)
edges[i++].d-=in[v];
else edges[i]=edges[--m];
}
n=tn;
rt=id[rt];
}
return res;
}

int main()
{
int T,kase=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)    scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].d);
printf("Case #%d: ",++kase);
int ans=zhuliu(0);
if(ans==INF) puts("Possums!");
else printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: