百度之星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:\n",cas);
        per(i,1,m){
            if(ans[i]==inf){printf("-1\n");continue;}
            else printf("%d\n",ans[i]);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/WindFreedom/p/9427618.html

时间: 2024-10-04 03:47:45

百度之星2018资格赛t6三原色图(MST minimum spanning tree)的相关文章

百度之星2018资格赛1002题解

作为退役的老人家来光顾光顾百度之星. 据说资格赛水过一道题就行...就写那个签到题吧.orz 题目糊上,,, 度度熊的字符串课堂开始了!要以像度度熊一样的天才为目标,努力奋斗哦! 为了检验你是否具备不听课的资质,度度熊准备了一个只包含大写英文字母的字符串 A[1,n]=a1a2?anA[1,n]=a?1??a?2???a?n??,接下来他会向你提出 qq 个问题 (l,r)(l,r),你需要回答字符串 A[l,r]=alal+1?arA[l,r]=a?l??a?l+1???a?r?? 内有多少个

【百度之星2014~资格赛解题报告】

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<标题>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=666 前言 最近要毕业了,有半年没做比赛了.这次参加百度之星娱乐一下.现在写一下解题报

百度之星2014资格赛 1004 - Labyrinth

先上题目: Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2911    Accepted Submission(s): 1007 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一

百度之星2014资格赛 1003 - Xor Sum

先上代码: Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total Submission(s): 7837    Accepted Submission(s): 3350 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus

&lt;百度之星2014资格赛&gt;Disk Schedule 报告

Disk ScheduleTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 780    Accepted Submission(s): 119 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景. 磁盘有

百度之星2016资格赛D,水题

很简单的题,主要是要用字符串哈希,把字符串处理成整数.接下来可以继续用hash,也可以像我一样用个map就搞定了. /* * Author : ben */ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <iostream> #include <algorithm> #in

百度之星2017资格赛1003 度度熊与邪恶大魔王

思路: 真是菜的不行. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int INF = 0x3f3f3f3f; 7 int dp[11][1001], A[100005], B[100005], K[1005], P[1005], n, m; 8 9 int main() 10 { 11 while (scanf(&

百度之星2015资格赛 放盘子

放盘子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 小度熊喜欢恶作剧.今天他向来访者们提出一个恶俗的游戏.他和来访者们轮流往一个正多边形内放盘子.最后放盘子的是获胜者,会赢得失败者的一个吻.玩了两次以后,小度熊发现来访者们都知道游戏的必胜策略.现在小度熊永远是先手,他想知道他是否能获胜. 注意盘子不能相交也不能和多边形相交也不能放在多边形外

百度之星2015资格赛 IP聚合

IP聚合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址.网络地址等于子网掩码与 IP 地址按位进行与运算后的结果,例如: 子网掩码:A.B.C.D IP 地址:a.b.c.d 网络地址: