CodeForces 505B Mr. Kitayuta's Colorful Graph

关于昨晚的B题
正常说,水题,深搜或者并查集都能做
然而
是谁说过看了看数据觉得能做就敲代码了。

要保存错误现场的代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
/*
struct edge{
    int u;
    int v;
    int color;
    public:
        friend operator <
};
*/
 int color[105][105];
 int n,m,q;

 vector<int> s[105];
 int getf(int c,int v){
    if(color[c][v]==0||color[c][v]==v) {
        color[c][v]=v;
         return v;
        }
    else color[c][v]=getf(c,color[c][v]);
    return color[c][v];
 }
 void merge(int c,int u,int v){
    int a=getf(c,u);
    int b=getf(c,v);
    color[c][b]=color[c][a];
 }
int main(){
    int a,b,c;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&a,&b,&c);
        merge(c,a,b);
        s[a].push_back(c);
        s[b].push_back(c);
    } 


/*  for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cout<<color[i][j]<<" ";
        }
        cout<<endl;
    }
*/
    cin>>q;
    int sum;
    for(int i=0;i<q;i++){
        scanf("%d%d",&a,&b);
        sum=0;
        int s1=s[a].size();
        int s2=s[b].size();
        if(s1<=s2){
            for(int i=0;i<s[a].size();i++){
                int c=s[a][i];
                if(getf(c,a)==getf(c,b)){
                    sum++;
                }
            }
            printf("%d\n",sum);
        }
        else{
            for(int i=0;i<s[b].size();i++){
                int c=s[b][i];
                if(getf(c,a)==getf(c,b)){

                    sum++;
                }

            }
            printf("%d\n",sum);

        }
        //for(int i=0;i)
    }
    return 0;
}

虽说是水题,一直觉得自己按颜色分类然后并查集很对啊,很完美,不知道代码哪里敲错了,原来没分析好题

set有毒

乾神跟我说每个节点的颜色有重复,然后我想那我按照原先用set存储就不会有重了,可是实现的时候我忘了为什么用set就改了vector好实现

此时乾神又跟我我说其实可以映射不用set~
不死心的继续改用set结果超时了

set有毒,可以参见下图

    2016-05-17  
 15:46:31
若静,l1-3的字符串b你用的数据结构是什么

Desperado 16:26:31
1看了一眼就没思路就没做
Desperado 16:26:39
3我看看着
Desperado 16:28:36
就是set
Desperado 16:29:18
判断字符是否存在集合里
 16:48:27
好的,知道了。这是个数据结构题。直接数组映射就可以。我看你提交了两次。l2-4就是递推。
Desperado 16:49:16
第一次格式错了
Desperado 16:50:22
恩,库函数用多了就总习惯性的用
 16:53:01
看起来要讨论下。这次题着重基本。

最终还是用映射ac

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
/*
struct edge{
    int u;
    int v;
    int color;
    public:
        friend operator <
};
*/
 int color[105][105];
 int n,m,q;

 int s[105][105];
 int getf(int c,int v){
    if(color[c][v]==0||color[c][v]==v) {
        color[c][v]=v;
         return v;
        }
    else color[c][v]=getf(c,color[c][v]);
    return color[c][v];
 }
 void merge(int c,int u,int v){
    int a=getf(c,u);
    int b=getf(c,v);
    color[c][b]=color[c][a];
 }
int main(){
    int a,b,c;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        scanf("%d%d%d",&a,&b,&c);
        merge(c,a,b);
        s[a][c]=1;
        s[b][c]=1;
    } 


/*  for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cout<<color[i][j]<<" ";
        }
        cout<<endl;
    }
*/
    cin>>q;
    int sum;
    for(int i=0;i<q;i++){
        scanf("%d%d",&a,&b);
        sum=0;

        {

            for(int i=1;i<=100;i++){
                if(s[a][i]){
                    int c=i;
                    if(getf(c,a)==getf(c,b)){
                    sum++;
                    }
                }

            }
            printf("%d\n",sum);
        }

        //for(int i=0;i)
    }
    return 0;
}

一个会莫名纠结的女子

重新开始记录我的生活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值