關於昨晚的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;
}
一個會莫名糾結的女子
重新開始記錄我的生活