const int mn=5555;
const int mm=mn*mn;
struct edge{
int u,v;
double cost;
}e[mm];
double In[mn];
int ID[mn];
int vis[mn];
int pre[mn];
int n,m;
double Directed_MST(int root)
{
double ret=0;
int u,v;
while(true)
{
for(int i=0;i<n;i++)
In[i]=INF;
for(int i=0;i<m;i++)
{
u=e[i].u;
v=e[i].v;
if(e[i].cost<In[v] && u!=v)
{
In[v]=e[i].cost;
pre[v]=u;
}
}
for(int i=0;i<n;i++)
{
if(i==root)
continue;
if(In[i]==INF)
return -1;
}
int cnt=0;
MST(ID,-1);
MST(vis,-1);
In[root]=0;
for(int i=0;i<n;i++)
{
ret+=In[i];
int v=i;
while(vis[v]!=i && ID[v]==-1 && v!=root)
{
vis[v]=i;
v=pre[v];
}
if(v!=root && ID[v]==-1)
{
for(u=pre[v];u!=v;u=pre[u])
{
ID[u]=cnt;
}
ID[v]=cnt++;
}
}
if(cnt==0)
break;
for(int i=0;i<n;i++)
{
if(ID[i]==-1)
ID[i]=cnt++;
}
for(int i=0;i<m;i++)
{
v=e[i].v;
e[i].u=ID[e[i].u];
e[i].v=ID[e[i].v];
if(e[i].u!=e[i].v)
{
e[i].cost-=In[v];
}
}
n=cnt;
root=ID[root];
}
return ret;
}
有根最小树形图模板
最新推荐文章于 2024-12-23 14:25:11 发布