分析:先构造一个进过所有点的环、然后再将剩下的边构造进环中、满足题意即可
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF 0x7ffffff
const int N=100;
int vis[N][N];
int dist[N][N];
int dp[6005];
int n,m;
int flag;
void init()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dist[i][j]=INF;
}
}
}
void solve()
{
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
memset(dist,0,sizeof(dist));
init();
for(int i=2;i<=n;i++)
{
dist[i-1][i]=i-1;
vis[i-1][i]=1;
vis[i][i-1]=1;
dp[i-1]=1;
}
if(n%3==0||n%3==2)
{
dist[n][1]=n;
vis[n][1]=1;
vis[1][n]=1;
dp[n]=1;
}
else
{
dist[n][1]=n+2;
vis[n][1]=1;
vis[1][n]=1;
dp[n+2]=1;
}
flag=0;
for(int w=1;w<=m;w++)
{
if(dp[w]==0)
{
int f=0;
for(int i=1;i<=n;i++)
{
if(f==1)break;
for(int j=1;j<=n;j++)
{
if(i==j)continue;
if(f==1)break;
if(vis[i][j]==0)
{
int sum=0;
if(i<j)
{
for(int k=i;k<j;k++)
{
sum+=dist[k][k+1];
}
}
else
{
for(int k=i;k<n;k++)sum+=dist[k][k+1];
sum+=dist[n][1];
for(int k=1;k<j;k++)sum+=dist[k][k+1];
}
if(sum%3==w%3&&sum<INF)
{
dist[i][j]=w;
vis[i][j]=1;
vis[j][i]=1;
dp[w]=1;
f=1;
break;
}
}
}
}
if(dp[w]==0)
{
flag=1;break;
}
}
}
}
struct node
{
int x,y,val;
}dot[6005];
int cmp(node a,node b)
{
if(a.val<b.val)return 1;
else return 0;
}
int main()
{
int t;
int cas=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
solve();
printf("Case #%d:\n",cas++);
if(flag)printf("-1\n");
else
{
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)continue;
if(vis[i][j]==1&&dist[i][j]<INF)
{
dot[ans].x=i;
dot[ans].y=j;
dot[ans++].val=dist[i][j];
vis[i][j]=vis[j][i]=2;
}
}
}
sort(dot,dot+m,cmp);
for(int i=0;i<m;i++)
{
printf("%d %d %d\n",dot[i].x,dot[i].y,dot[i].val);
}
}
}
return 0;
}