题意:

给出一个三角形城市,结构如下图所示。给出每个三角形的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. 处理机调度实验总结_计算机系统结构总结
  2. 你真的了解你的手机?—麦克风降噪
  3. Java监听器完整入门实例
  4. Java调试器和超时
  5. FPGA _Verilog HDL_8位加法计数器设计实验
  6. (二)为AI模型训练准备影像
  7. Java Annotation(注解)使用教程
  8. onvif协议规范与版本简介
  9. [MFC] 向文本编辑框写入数据与从其中读取数据
  10. linux shell将字符串分割数组
  11. CMD中可执行的结束进程命令
  12. Day01-python编程基础
  13. 微信电脑端突然发送不了文件了
  14. java猜拳_Java猜拳小游戏(剪刀、石头、布)
  15. Scratch——创建exe可执行文件
  16. WebRTC系列-Qos系列之发送NACK
  17. IEEE 802.11 RTS/CTS 协议
  18. 快捷录播服务器怎么显示时间,半自动高清录播服务器 高清全自动录播系统 方便携带 搭建快捷...
  19. 时空猎人服务器维护中是什么意思,时空猎人玩家自助FAQ问题汇总新手必备
  20. C++11 线程通信的三种方式

热门文章

  1. jetty client 与apache http client的实现、分析
  2. Windows Server 2008 R2的DHCP高可用
  3. tomcat设置独立jvm的例子
  4. 高中学业水平测试计算机考试知识点,高中生物学业水平测试知识点归纳
  5. Java之POI操作,封装ExcelUtil实现Excel导入导出
  6. unity api中文手册_unity 中文API之Display
  7. java程序基本语句,java入门4-基本语句
  8. SLAM--位姿估计 (扩展卡尔曼滤波EKF/高斯牛顿非线性优化)
  9. 自建服务器选择标准,自建CDN如何选择服务器
  10. inputstream 占用内存吗_明明是8G的内存,系统却显示只有4G!为什么电脑这么吃内存?...