水题!没其他想说的,还以为可以搞点高大上的搜索呢!十五分钟,暴力两重循环就OK了!
代码如下:
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #include<set> #include<vector> #include<map> #define maxn 400000 #define inf 0x3f3f3f3f //l2-023; using namespace std; int n,m,k; #define N 505 int a[N][N];//邻接矩阵 int main(){ while(scanf("%d%d%d",&n,&m,&k)!=EOF){ memset(a,0,sizeof(a)); int s,d; for(int i=1;i<=m;i++){ scanf("%d%d",&s,&d); a[s][d]=a[d][s]=1; } int q,c; scanf("%d",&q); while(q--){ int num=n,vis[N]={0},color[N]={0};//判断颜色种类数是否超过K for(int i=1;i<=n;i++){ scanf("%d",&c); vis[c]++; if(vis[c]>1)num--; color[i]=c; } if(num!=k){//第一次写的是num>k —— WA了一个样例! printf("No\n"); }else{ int flag=0; for(int i=1;i<=n&&!flag;i++){ for(int j=1;j<=n&&!flag;j++){ if(i!=j&&a[i][j]==1){ if(color[i]==color[j]){ flag=1;break; } } } } if(flag)printf("No\n"); else printf("Yes\n"); } } } return 0; }