您的位置:首页 > 其它

TJU 2248 Channel Design(最小树形图)

2017-01-01 19:55 316 查看
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=100+5;
const int maxm=10000+5;
const int inf=100000000;
int in[maxn],pre[maxn],vis[maxn],color[maxn],s[maxm],e[maxm],dis[maxm];
int n,m;
void MDST(int root)
{
int ans=0;
while(true)
{
memset(in,0x7f,sizeof(in));
memset(pre,-1,sizeof(pre));
for(int i=1;i<=m;i++){
if(dis[i]<in[e[i]]&&s[i]!=e[i]){
in[e[i]]=dis[i];
pre[e[i]]=s[i];
}
}
for(int i=1;i<=n;i++) if(i!=root&&pre[i]==-1) {printf("impossible\n");return ;}
int cnt=0;in[root]=0;;
memset(vis,-1,sizeof(vis));
memset(color,-1,sizeof(color));
for(int i=1;i<=n;i++){
int u,v=i;ans+=in[i];
while(v!=root&&vis[v]==-1) {vis[v]=i;v=pre[v];}
if(v!=root&&vis[v]==i)
for(color[v]=++cnt,u=pre[v];u!=v;u=pre[u]) color[u]=cnt;
}
if(cnt==0) break;
for(int i=1;i<=n;i++) if(color[i]==-1) color[i]=++cnt;
for(int i=1;i<=m;i++){
int u=s[i],v=e[i];
s[i]=color[u],e[i]=color[v];
if(color[u]!=color[v]) dis[i]-=in[v];
}
n=cnt;root=color[root];
}
printf("%d\n",ans);
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n+m))
{
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&s[i],&e[i],&dis[i]);
if(s[i]==e[i]) dis[i]=inf;
}
MDST(1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: