Think:
1根据题意通过结构体优化for循环次数
2及时结束暴力循环以减少时间复杂度
以下为Wrong Answer代码
错误原因:已经连接的边重复遍历,可能碰到临界数据k = 0的情况
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x;
int y;
}book[5400];
int e[204][204];
int main()
{
int T, n, m, k, u, v;
int a, b, c, i, j, tp, cnt;
scanf("%d", &T);
while(T--){
scanf("%d %d %d", &n, &m, &k);
memset(e, 0, sizeof(e));
for(i = 0; i < m; i++){
scanf("%d %d", &u, &v);
e[u][v] = e[v][u] = 1;
}
tp = 0;
for(i = 0; i < n; i++)
for(j = i; j < n; j++){
if(i != j && !e[i][j])
book[tp].x = i, book[tp].y = j, tp++;
}
cnt = 0;
for(a = 0; a < n; a++){
int flag = 0;
for(b = 0; b < tp; b++){
i = book[b].x;
j = book[b].y;
int t = 0;
for(c = 0; c < n; c++){
if(!e[i][j] && e[i][c] && e[c][j])
t++;
if(t >= k){
e[i][j] = e[j][i] = 1;
cnt++;
flag = 1;
break;
}
}
}
if(!flag)
break;
}
printf("%d\n", cnt);
}
return 0;
}
以下为Accepted代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x;
int y;
}book[5400];
int e[204][204];
int main()
{
int T, n, m, k, u, v;
int a, b, c, i, j, tp, cnt;
scanf("%d", &T);
while(T--){
scanf("%d %d %d", &n, &m, &k);
memset(e, 0, sizeof(e));
for(i = 0; i < m; i++){
scanf("%d %d", &u, &v);
e[u][v] = e[v][u] = 1;
}
tp = 0;
for(i = 0; i < n; i++)
for(j = i; j < n; j++){
if(i != j && !e[i][j])
book[tp].x = i, book[tp].y = j, tp++;
}
cnt = 0;
for(a = 0; a < n; a++){
int flag = 0;
for(b = 0; b < tp; b++){
i = book[b].x;
j = book[b].y;
if(i != j && !e[i][j]){
int t = 0;
for(c = 0; c < n; c++){
if(e[i][c] && e[c][j])
t++;
if(t >= k){
e[i][j] = e[j][i] = 1;
cnt++;
flag = 1;
break;
}
}
}
}
if(!flag)
break;
}
printf("%d\n", cnt);
}
return 0;
}