百度之星2018资格赛t6三原色图(MST minimum spanning tree)

Posted windfreedom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度之星2018资格赛t6三原色图(MST minimum spanning tree)相关的知识,希望对你有一定的参考价值。

 

ac代码:

#include<bits/stdc++.h>
#define per(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int mod=998244353;
const int inf =0x3f3f3f3f;
const double eps=1e-8;
#define siz 110
int n,m,Enum,ans[siz];
struct Edge
{
    int a,b,w;
    int ch;//红0 绿1 蓝2
    bool vis;
    bool operator<(Edge&e){return w<e.w;}
}edge[siz],tmp;
int f[siz];//
vector<int>v;
int Find(int u){return (f[u]==u)?u:f[u]=Find(f[u]);}
void kruscal(int no)//思维的妙处呀,本来想用type表示取红还是蓝,然后绿都可以,现在传一个no只要判断不是no就可以!
{
    v.clear();
    int Ecnt=0,ret=0,Euse=0;
    per(i,1,n)f[i]=i;
    for(int i=1;i<n;){
        if(Ecnt>=m)return ;
        tmp=edge[Ecnt++];
        while(tmp.ch==no){
            v.push_back(Ecnt-1);
            tmp=edge[Ecnt++];
            if(Ecnt-1 >= m)return ;
        }
        if(Find(tmp.a)!=Find(tmp.b)){
            ret+=tmp.w;
            Euse++;
            f[Find(tmp.b)]=Find(tmp.a);
            i++;
        }
        else {v.push_back(Ecnt-1);}
    }
    ans[Euse]=min(ans[Euse],ret);//
    while(!v.empty()){
        tmp=edge[v.front()]; v.erase(v.begin());
        ret+=tmp.w; //这里wa到爆,要注意,每种kruscal的ans都是先的取各自情况的边!!!所以min的时候不能直接用ans[Ecnt-1]
        ans[++Euse]=min(ans[Euse],ret);//因为这可能是另一种情况的边取法
    }
    per(i,Ecnt,m-1){ret+=edge[i].w;ans[++Euse]=min(ans[Euse],ret);}
}
int main()
{
    int T;
    scanf("%d",&T);
    int cas=0;
    while(T--){
        cas++;
        scanf("%d %d",&n,&m);
        Enum=0;
        per(i,0,m)ans[i]=inf;
        char kd;
        per(i,1,m){
            scanf("%d %d %d %c",&edge[Enum].a,&edge[Enum].b,&edge[Enum].w,&kd);
            if(kd==G)edge[Enum].ch=1;
            else if((kd==R))edge[Enum].ch=0;
            else edge[Enum].ch=2;
            Enum++;
        }
        sort(edge,edge+Enum);
        kruscal(0);
        kruscal(2);
        printf("Case #%d:
",cas);
        per(i,1,m){
            if(ans[i]==inf){printf("-1
");continue;}
            else printf("%d
",ans[i]);
        }
    }
    return 0;
}

 

以上是关于百度之星2018资格赛t6三原色图(MST minimum spanning tree)的主要内容,如果未能解决你的问题,请参考以下文章

百度之星2018资格赛1002题解

2018百度之星资格赛1002

2018百度之星资格赛 1001调查问卷(状压dp)

2018"百度之星"程序设计大赛 - 资格赛

2018百度之星资格赛1001 调查问卷

2018百度之星资格赛T2 子串查询