通过比较两种做法,针对不同题型熟练使用不同记录节点和边的存储结构!!!
TLE代码:
#include<iostream>
#include<cstring>
#include<unordered_map>
#include<unordered_set>
#include<vector>
using namespace std;
const int N=1e4+10;
int g[N][N];
int idx;
int n,m;
int main(){
cin>>n>>m;
while(m--){
int a,b;
cin>>a>>b;
idx++;
g[a][b]=idx;
g[b][a]=idx;
}
int k;
cin>>k;
while(k--){
unordered_set<int>res;
unordered_map<int,unordered_set<int>>ans;
for(int i=0;i<n;i++){
int x;
cin>>x;
ans[x].insert(i);
res.insert(x);
}
int flag=0;
for(auto &j:res){
if(ans[j].size()>=2){
for(auto &t:ans[j]){
for(auto &tt:ans[j]){
if(t!=tt&&g[t][tt])
{
flag=1;
break;
}
}
if(flag)
break;
}
if(flag)
break;
}
}
if(flag)
cout<<"No"<<endl;
else{
cout<<res.size()<<"-coloring"<<endl;
}
}
return 0;
}
AC代码:
#include<iostream>
#include<cstring>
#include<unordered_map>
#include<unordered_set>
#include<vector>
using namespace std;
const int N=1e4+10;
struct{
int a,b;
}R[N];
int idx;
int n,m;
int st[N];
int main(){
cin>>n>>m;
while(m--){
int a,b;
cin>>a>>b;
idx++;
R[idx]={a,b};
}
int k;
cin>>k;
while(k--){
memset(st,0,sizeof st);
unordered_set<int>temp;
for(int i=0;i<n;i++){
int x;
cin>>x;
x++;
st[i]=x;
temp.insert(x);
}
int flag=0;
for(int i=1;i<=idx;i++){
if(st[R[i].a]&&st[R[i].a]==st[R[i].b]){
flag=1;
break;
}
}
if(flag){
cout<<"No"<<endl;
}
else{
cout<<temp.size()<<"-coloring"<<endl;
}
}
return 0;
}