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; }
相关文章推荐
- quick-cocos-2d-x学习
- 数据结构(十二) 二叉树的基本操作 --- 创建一个二叉树 前中后序遍历二叉树
- ZCMU—1200
- php安装redis拓展
- (25)曲线和曲面基础
- 大顶堆(堆排序)
- scrapy-redis(八):安装scrapy监控app--graphite
- thinkphp 5使用行为进行用户登录验证。
- BZOJ4514 [Sdoi2016]数字配对
- 读书笔记《你不知道的JavaScript上卷》1.1作用域是什么
- mysql配置——备份与恢复
- R 培训之 Table
- 杰克·康菲尔德:灵性成熟的十个特质
- mysql配置——库表操作、用户操作
- 生活在别处
- java 解析json字符串
- Linux Shell基础知识
- mysql配置——登陆
- 关于Android4.0 BLE编程的一点总结(搜索篇)
- nodejs学习express4.x+mongodb(二)