题意:

构造一个\(N(10 \leq N \leq 80)\)个顶点\(M(N+3 \leq M \leq \frac{N^2} {7})\)条边的有向图,要满足如下条件:

  • 每条边有一个\([1,M]\)之间的权值,而且每条边的权值都是独一无二的
  • 该有向图是强联通的,即任意两点都互相可达
  • 图没有自环,而且任意两点之间最多有一条边
  • 可以从任意一点出发,经过任意条边,一条边可以走多次,再回到出发点
  • 符合上述要求的路径权值之和为3的倍数

分析:

首先我们构造一个长度为\(N\)的环,而且环的权值之和为3的倍数。

构造过程如下:

在顶点\(i\)到\(i+1\)之间连一条长度为\(i\)的有向边,然后在\(N \sim N+2\)之间选一个使得整个环权值和为3的倍数,把这个作为边\((N,1)\)的权值。

这样我们得到的图就满足题目中的要求,但是还剩下\(M-N\)条边没有处理。

对于还没有选用的权值\(w\),选择一对没有连边的顶点\((u,v)\)。

设\(u \rightarrow v\)的路径上的权值和为\(sum\),如果\(w \equiv sum \: (mod 3)\),那么就在这两点之间连边。

这样添边的过程,依然使得原图的性质满足题目要求。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std; const int maxn = 80 + 10;
const int maxm = 1000; int G[maxn][maxn], dis[maxn][maxn]; struct Edge
{
int u, v, d;
Edge() {}
Edge(int u, int v, int d):u(u), v(v), d(d) {}
}; int n, m;
int ecnt;
Edge edges[maxm];
bool vis[maxm]; void AddEdge(int u, int v, int d) {
edges[ecnt++] = Edge(u, v, d);
G[u][v] = G[v][u] = true;
} int main() {
int T; scanf("%d", &T);
for(int kase = 1; kase <= T; kase++) {
scanf("%d%d", &n, &m); memset(vis, false, sizeof(vis));
memset(G, false, sizeof(G));
ecnt = 0; for(int i = 1; i < n; i++) {
AddEdge(i, i + 1, i);
vis[i] = true;
}
int sum = (n * (n - 1) / 2) % 3, tmp;
for(int i = n; ; i++) if((i + sum) % 3 == 0) {
vis[i] = true;
AddEdge(n, 1, i);
tmp = i;
break;
} for(int i = 2; i <= n; i++) {
dis[i-1][i] = (i - 1) % 3;
dis[i][i-1] = (3 - dis[i-1][i]) % 3;
for(int j = i - 2; j >= 1; j--) {
dis[j][i] = (dis[j][i-1] + dis[i-1][i]) % 3;
dis[i][j] = (3 - dis[j][i]) % 3;
}
}
dis[n][1] = tmp % 3;
for(int i = 2; i < n; i++) dis[n][i] = (dis[n][1] + dis[1][i]) % 3; bool ok = true;
for(int i = n; i <= m; i++) if(!vis[i]) {
bool findit = false;
for(int u = 1; u <= n; u++) {
for(int v = 1; v <= n; v++) if(u != v) {
if(dis[u][v] % 3 == i % 3 && !G[u][v]) {
findit = true;
AddEdge(u, v, i);
break;
}
}
if(findit) break;
}
if(!findit) { ok = false; break; }
} printf("Case #%d:\n", kase);
if(ok) {
for(int i = 0; i < m; i++)
printf("%d %d %d\n", edges[i].u, edges[i].v, edges[i].d);
}
else printf("-1\n");
} return 0;
}

HDU 4781 Assignment For Princess 构造的更多相关文章

  1. hdu 4781 Assignment For Princess (2013ACMICPC 成都站 A)

    http://acm.hdu.edu.cn/showproblem.php?pid=4781 由于题目太长,这里就不直接贴了,直接说大意吧. 题目大意:有一个n个点,m条边的有向图,每条边的权值分别为 ...

  2. hdu4781 Assignment For Princess(构造)

    题目链接:hdu4781 Assignment For Princess 题意:n个点m条边,每条有向边的权值分别是1,2,3…m,一个点能到达任意一个点,没有重边和自环,没有任何两条边的权值相同,任 ...

  3. HDU 2853 Assignment(KM最大匹配好题)

    HDU 2853 Assignment 题目链接 题意:如今有N个部队和M个任务(M>=N),每一个部队完毕每一个任务有一点的效率,效率越高越好.可是部队已经安排了一定的计划,这时须要我们尽量用 ...

  4. HDU 5289 Assignment [优先队列 贪心]

    HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...

  5. hdu 2853 Assignment KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...

  6. HDU 4308 BFS Saving Princess claire_

    原题直通车:HDU 4308 Saving Princess claire_ 分析: 两次BFS分别找出‘Y’.‘C’到达最近的‘P’的最小消耗.再算出‘Y’到‘C’的最小消耗,比较出最小值 代码: ...

  7. HDU - 6313 Hack It(构造)

    http://acm.hdu.edu.cn/showproblem.php?pid=6313 题意 让你构造一个矩阵使得里面不存在四个顶点都为1的矩形,并且矩阵里面1的个数要>=85000 分析 ...

  8. HDU 4685 Prince and Princess 二分图匹配+tarjan

    Prince and Princess 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 Description There are n pri ...

  9. HDU 5289 Assignment rmq

    Assignment 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Description Tom owns a company and h ...

随机推荐

  1. echarts使用中的那些事儿( 三)

    饼图上的那些字与下面说明性的文字有些重合,该怎么缩小圆形的大小呢,还有它的位置,怎么让它向上一些或者向下一些: 有以下两个属性可以解决问题: radius : '55%', ------------这 ...

  2. web常见几种处理图标方法

    方法一: 用background制作小图标 像这样,拿到设计稿后把所有的图标放在一张图片上,利用background-position.width.height来控制图标的位置及大小. 代码: .ic ...

  3. RSA加密解密(转)

    RSA加密解密 对于RSA产生的公钥.私钥,我们可以有两种方式可以对信息进行加密解密.私钥加密-公钥解密 和 公钥加密-私钥解密RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest) ...

  4. put_user

    1. put_user Name put_user --    Write a simple value into user space. Synopsis put_user ( x, ptr); A ...

  5. C++拾遗(七)——关联容器

    关联容器(Associative containers)支持通过键来高效地查找和读取元素.两个基本的关联容器类型是 map 和set.map 的元素以键-值(key-value)对的形式组织:键用作元 ...

  6. SQL Server 2016,2014 “无法找到数据库引擎启动句柄”

    当我决定安装SharePoint 2016 IT预览版时,我想我应该将它安装在Windows Server 2016技术预览版以及SQL Server 2016社区技术预览版(CTP)上.我敢打赌,你 ...

  7. 洛谷 P2905 [USACO08OPEN]农场危机Crisis on the Farm

    题目描述 约翰和他的奶牛组建了一只乐队“后街奶牛”,现在他们正在牧场里排练.奶牛们分成一堆 一堆,共1000)堆.每一堆里,30只奶牛一只踩在另一只的背上,叠成一座牛塔.牧场 里还有M(1 < ...

  8. 【TensorFlow入门完全指南】神经网络篇·循环神经网络(RNN)

    第一步仍然是导入库和数据集. ''' To classify images using a reccurent neural network, we consider every image row ...

  9. 在windows 上编译部署Rap2

    在windows 上编译部署Rap2 引言 安装需要的环境 安装后端站点 创建数据库 在全局安装pm2 和 typescript 配置mysql,redis 数据库链接配置 初始化 编译 初始化数据库 ...

  10. 如何对ABAP SE80 workbench做增强

    流程如下: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":