题意:

给出一个三角形城市,结构如下图所示。给出每个三角形的aaa、bbb、ccc三个边权,求从(1,1)(1,1)(1,1)到(n,n)(n,n)(n,n)的最长路,要求每条边在最长路中最多出现一次。(2≤n≤300)(2\leq n\leq 300)(2≤n≤300)


思路:

观察一下这幅图,可以发现图中每一个点的度数均为偶数,因此我们可以联想到欧拉回路,但这题是求从(1,1)(1,1)(1,1)到(n,n)(n,n)(n,n)的一条路径,因此回路肯定不行,所以进一步联想到了欧拉路径,而欧拉路径就是起点和终点度数为奇数,其他点的度数均为偶数。

所以问题就变成了从图中去除掉一个边集SSS,使得(1,1)(1,1)(1,1)和(n,n)(n,n)(n,n)的度数变为奇数,而其他点的度数仍为偶数,然后跑一个欧拉路即可。我们的目的就是让边集SSS中边权之和最小。

去掉图中任何一条边,都会使得边相邻两个顶点的度数减111,而最后目的是只有(1,1)(1,1)(1,1)和(n,n)(n,n)(n,n)的度数减奇数次,其他所有点的度数都要减偶数次。稍微尝试构建一下就会发现起点和终点度数均为222,因此最多减去一条边,所以减掉的边一定是起点到终点的一条路径,而让这条路径上边权之和最小,便可以想到求最短路。

因此此题正解为先求出起点到终点的最短路,然后将最短路上所有边从图中去掉,然后再从起点到终点跑一条欧拉路径即可。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <stack>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int N = 300*300+100;
const int M = 300*300*6+100;
const ll inf = 5*1e16;
const db EPS = 1e-9;
using namespace std;int n,tot,head[N],vis[N],pre[N][2],base[N][2];
ll dis[N],ans;
struct Edge{int to,next,vis;ll w;
}e[M];priority_queue<pair<ll,int> > q;
stack<int> stk;void init(){tot = 1; ans = 0;rep(i,0,n*n) head[i] = 0;while(stk.size()) stk.pop();
}void add(int x,int y,ll w){e[++tot].to = y, e[tot].next = head[x], head[x] = tot, e[tot].w = w, e[tot].vis = 1;
}void dijkstra(int s){while(q.size()) q.pop();rep(i,0,n*n) vis[i] = 0, dis[i] = inf, pre[i][0] = 0;dis[s] = 0;q.push(make_pair(0ll,s));while(q.size()){int x = q.top().second;q.pop();if(vis[x]) continue;vis[x] = 1;for(int i = head[x]; i; i = e[i].next){int y = e[i].to;ll z = e[i].w;if(dis[y] > (ll)(dis[x]+z)){pre[y][0] = x; pre[y][1] = i;dis[y] = dis[x]+z;q.push(make_pair(-dis[y],y));}}}int t = (1+n)*n/2;while(pre[t][0]){int tp = pre[t][1];e[tp].vis = 0;e[tp^1].vis = 0;t = pre[t][0];}
}void dfs(int x){for(int i = head[x]; i; i = e[i].next){if(e[i].vis == 0) continue;ans += e[i].w;e[i].vis = 0; e[i^1].vis = 0;dfs(e[i].to);}stk.push(x);
}void solve(){printf("%lld\n",ans);printf("%d\n",(int)stk.size());while(stk.size()){int y = stk.top(); stk.pop();printf("%d %d",base[y][0],base[y][1]);if(stk.size()) printf(" ");else printf("\n");}
}int main()
{int _; scanf("%d",&_);rep(i,1,300)rep(j,1,i){int x = (i*(i-1)/2)+j;base[x][0] = i;base[x][1] = j;}while(_--){scanf("%d",&n);init();rep(i,1,n-1){rep(j,1,i){ll w; scanf("%lld",&w);int x = (i*(i-1)/2)+j;int y = ((1+i)*i/2)+j;add(x,y,w); add(y,x,w);}}rep(i,1,n-1){rep(j,1,i){ll w; scanf("%lld",&w);int x = (i*(i-1)/2)+j;int y = ((1+i)*i/2)+j+1;add(x,y,w); add(y,x,w);}}rep(i,1,n-1){rep(j,1,i){ll w; scanf("%lld",&w);int x = ((1+i)*i/2)+j;int y = ((1+i)*i/2)+j+1;add(x,y,w); add(y,x,w);}}dijkstra(1);dfs(1);solve();}return 0;
}

【山东2019省赛J题 ZOJ 4122】Triangle City【最短路去边+欧拉路】相关推荐

  1. ZOJ - 4122 Triangle City(最短路+欧拉通路+思维)

    题目链接:点击查看 题目大意:给出一张三角形的无向图,如下图所示 求出从点 ( 1 , 1 ) 到点 ( n , n ) 找到一条最长路,且每条边至多遍历一次,输出最长路的权值以及路径 题目分析:点 ...

  2. 2019电赛 H题-电磁炮 视觉部分

    2019电赛-H题-电磁炮-视觉自瞄部分; 硬件平台: Jetson Nano, Realsense D435 实现功能:识别到引导标志反馈坐标及距离,串口输出 #include <iostre ...

  3. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  4. luogu 1327 数列排序 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节

    luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...

  5. 2017乌鲁木齐网络赛 j 题

    题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...

  6. 模拟电磁炮国一设计资料【2019电赛H题国一作品】

    经历重重测试,从初赛杀进综测再到去上海复测,真是一路坎坷啊!回顾电赛准备阶段,在实验室基地的我们熬了多少个夜,废寝忘食的学习-仅仅是为了能更有信心的面对电赛:在电赛的四天三夜中我们经历了太多,我们将近 ...

  7. 2019电赛D题方案:简易电路特性测试仪

    一.题目 二.评分标准 三.题目分析与测量原理 此题设计两部分电路,一个是由S9013组成的基本放大电路,另一个是电路特性测试仪.前者是被测对象,涉及一个输入测试信号(1KHz,Vpp=10mV)和一 ...

  8. 【全国大学生电子设计竞赛】2019电赛H题复盘录——电磁曲射炮+综合测评

    这是我本科阶段的最后一战,本来期待一个完美收官,但是意外频频,打的不尽如人意,但收获还是有的,故在此复盘,留下一些可供后来人参考的东西. 在此感谢我的队友CJC,WJJ,陪我一起熬夜! 笔者才疏学浅, ...

  9. 2018南京网络赛 j题 sum

    代码1: #include<bits/stdc++.h>using namespace std; typedef long long ll; const int N =2e7+5; boo ...

  10. QAU 18校赛 J题 天平(01背包 判断能否装满)

    问题 J: 天平 时间限制: 1 Sec  内存限制: 128 MB 提交: 36  解决: 9 [提交][状态][讨论版][命题人:admin] 题目描述 天平的右端放着一件重量为w的物品.现在有n ...

最新文章

  1. KDD CUP 2020之Debiasing赛道方案 (Rush)
  2. 安卓 sqlite数据存入mysql_在Android上简单导出和导入SQLite数据库
  3. android 输入模糊匹配_Android 模糊搜索rawquery bind or column index out of range:
  4. 网红手工耿造了辆电动汽车 罗永浩点赞 网友喊话雷军投资
  5. docker运行dubbo-admin
  6. oracle stream参数,oracle stream实验(双向复制)
  7. C Primer Plus 第七章 第九题
  8. ITIL 4: 培训与认证
  9. MAC使用RZ SZ指令实现本地与远程服务器之间文件上传与下载
  10. ASP类计算机专业毕业设计题目
  11. Word论文用的各级标题大小
  12. postman中文汉化版
  13. 计算机二进制编码原理,计算机组成原理--二进制编码
  14. heartbeat高可用详解
  15. 电脑很大,电脑内存很大为什么还是很卡
  16. php 获取上周日期_php获取本周以及上周 开始 和结束的日期
  17. switch开关语句
  18. 记录下如何用vue实现PC端网易云轮播图效果
  19. 如何在Python中加速信号处理
  20. java操作excel方法_Java实现操作excel表格的方法

热门文章

  1. 开源日志系统log4cplus(五)
  2. 流浪北京的日子(二)
  3. Spring的bean管理(xml方式)之Bean实例化的方式
  4. PHP修改防火墙ip,利用防火墙进行同网段下的ip地址欺骗
  5. c string erase_威刚推出SE770G移动固态硬盘:提供两年质保 附送双头USB-C
  6. h5后台登录模板_微信公众号模板消息群发工具如何操作?
  7. react 获取url参数_十分钟上手 React+MirrorX,从此前端大神代码不再难懂
  8. 【Golang】基于RSA算法的数据通信和数字签名
  9. hdoj6298:Maximum Multiple(找规律,总结)
  10. 进程调度优先数 c语言,进程调度--动态优先数法(C语言实现)