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;
}

一個會莫名糾結的女子

重新開始記錄我的生活

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章