关于昨晚的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;
}
一个会莫名纠结的女子
重新开始记录我的生活