CodeForces 505BMr. Kitayuta's Colorful Graph

来源:互联网 发布:水果店会员卡软件 编辑:程序博客网 时间:2024/06/06 03:30

关于昨晚的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:311看了一眼就没思路就没做Desperado 16:26:393我看看着Desperado 16:28:36就是setDesperado 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;}

一个会莫名纠结的女子

重新开始记录我的生活

0 0
原创粉丝点击