zoukankan      html  css  js  c++  java
  • 【POJ】1679 The Unique MST

    题目链接:http://poj.org/problem?id=1679

    题意:给你一组数据,让你判断是否是唯一的最小生成树。

    题解:这里用的是kuangbin大佬的次小生成树的模板。直接判断一下次小生成树的最小花费和最小生成树的是否一样即可。

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 const int maxn = 110;
     7 const int inf = 0x3f3f3f3f;
     8 
     9 bool vis[maxn];
    10 int lowc[maxn];
    11 int pre[maxn];
    12 int Max[maxn][maxn];//Max[i][j]表示在最小生成树中从i到j的路径中的最大边权
    13 bool used[maxn][maxn];
    14 int mp[maxn][maxn];
    15 int n,m;
    16 
    17 
    18 int prim(){
    19     int ans = 0;
    20     memset(vis,false,sizeof(vis));
    21     memset(Max,0,sizeof(Max));
    22     memset(used,false,sizeof(used));
    23     
    24     vis[0] = true;
    25     pre[0] = -1;
    26     
    27     for(int i = 1; i < n; i++){
    28         lowc[i] = mp[0][i];
    29         pre[i] = 0;
    30     }
    31 
    32     lowc[0] = 0;
    33     for(int i = 1 ; i < n;i++){
    34         int minc = inf;
    35         int p = -1;
    36         for(int j = 0; j < n;j++)
    37             if(!vis[j] && minc > lowc[j]){
    38                 minc = lowc[j];
    39                 p = j;
    40             }
    41         if(minc == inf) return -1;
    42         ans += minc;
    43         vis[p] = true;
    44         used[p][ pre[p] ] = used[ pre[p] ][p] = true;
    45         for(int j = 0 ; j < n; j++){
    46             if(vis[j])
    47                 Max[j][p] = Max[p][j] = max(Max[j][ pre[p] ],lowc[p]);
    48             if(!vis[j] && (lowc[j] > mp[p][j] ) ){
    49                 lowc[j] = mp[p][j];
    50                 pre[j] = p;
    51             }
    52         }
    53     }
    54     return ans;
    55 }
    56 int ans;
    57 int smst(){
    58     int minn = inf;
    59     for(int i = 0; i < n; i++)
    60         for(int j = i+1 ; j < n;j++)
    61             if(mp[i][j] != inf && !used[i][j]){
    62                 minn = min(minn, ans + mp[i][j] - Max[i][j]);
    63             }
    64     if(minn == inf) return -1;//不存在
    65     return minn;
    66 }
    67 
    68 int main(){
    69     int T;
    70     cin>>T;
    71     while(T--){
    72         cin>>n>>m;
    73         int x,y,w;
    74         memset(mp,inf,sizeof(mp)); 
    75         for(int i = 0; i < n ;i++){
    76             mp[i][i] = 0;
    77         }
    78         while(m--){
    79             cin>>x>>y>>w;
    80             x--,y--;
    81             mp[x][y] = mp[y][x] = w;
    82         }
    83         ans = prim();
    84         //cout<<smst()<<endl;
    85         if(ans == -1){
    86             cout<<"Not Unique!"<<endl;
    87         }
    88         else if( ans == smst()){
    89             cout<<"Not Unique!"<<endl;   
    90         }
    91         else{
    92             cout<<ans<<endl;
    93         }
    94     }
    95     
    96     return 0;
    97 }
  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/Asumi/p/9749107.html
Copyright © 2011-2022 走看看