TJU 2248 Channel Design (最小树形图

题目地址:TJU 2248 最小树形图模板题。熟练一下模板。 代码如下:

;mod=1e9+7;const int INF=0x3f3f3f3f;const double eqs=1e-9;const int MAXN=40000+10;int cnt, n;int in[110], color[110], id[110], pre[110];struct node{int u, v, w;}edge[20000];void add(int u, int v, int w){edge[cnt].v=v;edge[cnt].u=u;edge[cnt++].w=w;}int d_mst(int root){int ans=0, i, u, v;while(1){memset(in,INF,sizeof(in));for(i=0;i<cnt;i++){u=edge[i].u;v=edge[i].v;if(u!=v&&edge[i].w<in[v]){in[v]=edge[i].w;pre[v]=u;}}for(i=1;i<=n;i++){if(in[i]==INF&&i!=root) return-1;}int tot=0;memset(color,-1,sizeof(color));memset(id,-1,sizeof(id));in[root]=0;for(i=1;i<=n;i++){ans+=in[i];u=i;while(color[u]!=i&&id[u]==-1&&u!=root){color[u]=i;u=pre[u];}if(id[u]==-1&&u!=root){id[u]=++tot;for(v=pre[u];v!=u;v=pre[v]){id[v]=tot;}}}if(!tot) break;for(i=1;i<=n;i++){if(id[i]==-1) id[i]=++tot;}for(i=0;i<cnt;i++){v=edge[i].v;edge[i].u=id[edge[i].u];edge[i].v=id[edge[i].v];if(edge[i].u!=edge[i].v){edge[i].w-=in[v];}}n=tot;root=id[root];}return ans;}int main(){int m, u, v, w, ans;while(scanf(“%d%d”,&n,&m)!=EOF&&n+m){cnt=0;while(m–){scanf(“%d%d%d”,&u,&v,&w);if(u==v) continue;add(u,v,w);}ans=d_mst(1);if(ans==-1) puts(“impossible”);else printf(“%d\n”,ans);}return 0;}

,天不负;卧薪尝胆,三千越甲可吞吴。

TJU 2248 Channel Design (最小树形图

相关文章:

你感兴趣的文章:

标签云: