HDU-2121-Ice_cream’s world II 9(不定根最小树形图)
2017-02-21 21:49
483 查看
题目链接:HDU-2121-Ice_cream’s world II 9
给定一个图,要求找到其最小树形图,并给出其权值以及最小树形图的根。
思路是设置一个人造根,这个根对所有点都有一条出边,权值大于原图所有边的权值sum。
这样原图的树形图再加上一条人造边就是新图的最小树形图。
这样我们可以得到权值,如果权值>=sum*2,则说明引入了大于等于两条人造边,这说明原图无法构成一个树形图。否则权值-sum就是答案。
然后可以套模板。不过题目还要求出根。所以还要改一下。
我们把最后缩点的时候edges[u]==edges[v]的边保留。这样在找最小入边时就容易得到边的下标与人造根指向点的关系。如果这个树有最小树形图,那么至少有一次引入人造边,因此可以得到新根。
给定一个图,要求找到其最小树形图,并给出其权值以及最小树形图的根。
思路是设置一个人造根,这个根对所有点都有一条出边,权值大于原图所有边的权值sum。
这样原图的树形图再加上一条人造边就是新图的最小树形图。
这样我们可以得到权值,如果权值>=sum*2,则说明引入了大于等于两条人造边,这说明原图无法构成一个树形图。否则权值-sum就是答案。
然后可以套模板。不过题目还要求出根。所以还要改一下。
我们把最后缩点的时候edges[u]==edges[v]的边保留。这样在找最小入边时就容易得到边的下标与人造根指向点的关系。如果这个树有最小树形图,那么至少有一次引入人造边,因此可以得到新根。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll INF=1e18+7; int n,m; struct Edge { int u,v; ll d; }; Edge edges[10007+1007]; ll in[1007]; int pre[1007],vis[1007],id[1007]; int root; ll zhuliu(int rt) { ll 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; if(edges[i].u==rt) root=i; } } for(int i=0;i<=n;i++) if(i!=rt&&in[i]==INF) return INF; int tn=-1; memset(vis,-1,sizeof(vis)); memset(id,-1,sizeof(id)); in[rt]=0; for(int i=0;i<=n;i++) { int u=i; res+=in[u]; while(u!=rt&&id[u]==-1&&vis[u]!=i) { vis[u]=i; u=pre[u]; } if(u!=rt&&id[u]==-1) { id[u]=++tn; for(int v=pre[u];v!=u;v=pre[v]) id[v]=tn; } } if(tn==-1) break; for(int i=0;i<=n;i++) if(id[i]==-1) id[i]=++tn; for(int i=0;i<m;i++) { 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]; } n=tn; rt=id[rt]; } return res; } int main() { while(~scanf("%d%d",&n,&m)) { ll sum=1; int r=m; for(int i=0;i<m;i++) { scanf("%d%d%I64d",&edges[i].u,&edges[i].v,&edges[i].d); sum+=edges[i].d; edges[i].u++; edges[i].v++; } for(int i=1;i<=n;i++) { edges[m+i-1].u=0; edges[m+i-1].v=i; edges[m+i-1].d=sum; } m+=n; ll ans=zhuliu(0); if(ans>=2*sum) puts("impossible\n"); else printf("%I64d %d\n\n",ans-sum,root-r); } }
相关文章推荐
- HDU 2121 Ice_cream’s world II(不定根最小树形图)
- HDU 2121 Ice_cream’s world II(不定根最小树形图)
- HDU 2121 Ice_cream’s world II(不定根最小树形图)
- HDU 2121 Ice_cream’s world II(不定根最小树形图)
- HDU 2121 Ice_cream’s world II (不定根最小树形图)
- HDU 2121:Ice_cream’s world II(不定根最小树形图)
- HDU - 2121 Ice_cream’s world II(朱刘算法+虚根)
- HDU 2121 Ice_Cream's World II (最小树形图)
- HDU 2121 Ice_cream’s world II
- HDU 2121 Ice_cream’s world II
- HDU - 2121-Ice_cream’s world II-无根最小树形图
- Command Network POJ - 3164 + Ice_cream’s world II HDU - 2121
- Ice_cream’s world II - HDU 2121 朱刘算法
- HDU 2121 Ice_cream’s world II 无固定根的最小树形图以及最小根
- HDU-2121-Ice_cream’s world II
- hdu 2121 Ice_cream’s world II(无固定根最小树形图)
- HDU 2121 Ice_cream’s world II 最小树形图 模板
- hdu 2121 Ice_cream’s world II
- HDU 2121 Ice_cream’s world II
- HDU 2121-Ice_cream’s world II