说实话,这题真第一次见,学到了不少有趣的东西,因吹丝汀!!

思路:因为不可能同时并行和相遇(我也不知道为啥,等我会证明了就来说说)

所以正向建边再反向建边,拓扑排序+dp求最下长路,记录下最大的就是解

高中生的OI题好难呀

#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
#define maxn 2000
const int mod = 10000;
map<long long, int>ins;
struct Node {
int p;
int len;
Node(int a, int b) :p(a), len(b) {}
};
bool operator < (const Node a, const Node b) {
return a.len > b.len;
} vector<Node>G[maxn], G2[maxn];
int vis[maxn]; void insert(int be, int en, int len) {
G[be].push_back(Node(en, len));
}
int dijstra(int be, int *dis) {
for (int i = 1; i <= 1999; i++) dis[i] = 0x3f3f3f3f;
memset(vis, 0, sizeof(vis));
priority_queue<Node>que;
que.push(Node(be, 0));
dis[be] = 0;
while (!que.empty()) {
Node ans = que.top();
que.pop();
if (vis[ans.p] == 0) {
vis[ans.p] = 1;
for (int i = 0; i < G[ans.p].size(); i++) {
int p = G[ans.p][i].p;
if (dis[p] > dis[ans.p] + G[ans.p][i].len) {
dis[p] = dis[ans.p] + G[ans.p][i].len;
que.push(Node(p, dis[p]));
}
}
}
}
return 0;
}
int de[maxn];//度数
int n, m;
int ddd[maxn];
int topu() {
queue<int>que;
for (int i = 1; i <= n; i++) if (de[i] == 0) que.push(i);
while (!que.empty()) {
int x = que.front();
que.pop();
for (int i = 0; i < G2[x].size(); i++){
int p = G2[x][i].p;
ddd[p] = max(ddd[p], ddd[x] + G2[x][i].len);
de[p]--;
if (!de[p]) que.push(p);
}
}
return 0;
}
int dis1[maxn];
int dis2[maxn];
int dis3[maxn];
int dis4[maxn];
int main() { int be1, en1, be2, en2;
int len;
scanf("%d %d", &n, &m);
cin >> be1 >> en1 >> be2 >> en2;
int be, en;
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &be, &en, &len);
insert(be, en, len);
insert(en, be, len);
}
dijstra(be1, dis1);
dijstra(en1, dis2);
dijstra(be2, dis3);
dijstra(en2, dis4);
int ans = -1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j < G[i].size(); j++) {
int bee = i;
int enn = G[i][j].p;
int dt = G[i][j].len;
if (dis1[bee] + dis2[enn] + dt == dis1[en1]) {
if (dis3[bee] + dis4[enn] + dt == dis3[en2]) {//正向
G2[bee].push_back(Node(enn, dt));
de[enn]++;
}
}
}
}
topu();
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++) {
ans = max(ddd[i], ans);
}
memset(ddd, 0, sizeof(ddd));
memset(de, 0, sizeof(de));
for (int i = 1; i <= n; i++) G2[i].clear(); for (int i = 1; i <= n; i++) {
for (int j = 0; j < G[i].size(); j++) {
int bee = i;
int enn = G[i][j].p;
int dt = G[i][j].len;
if (dis1[bee] + dis2[enn] + dt == dis1[en1]) {
if (dis3[enn] + dis4[bee] + dt == dis3[en2]) {//正向
G2[bee].push_back(Node(enn, dt));
de[enn]++;
}
}
}
}
topu();
for (int i = 1; i <= n; i++) {
ans = max(ddd[i], ans);
}
cout << ans << endl;
return 0;
}

  

洛谷p2149----两个终点和两个起点,最短路最大交汇长度!!!的更多相关文章

  1. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  2. 2018.07.22 洛谷P3106 GPS的决斗Dueling GPS's(最短路)

    传送门 图论模拟题. 这题直接写3个(可以压成一个)spfa" role="presentation" style="position: relative;&q ...

  3. 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告

    P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia ...

  4. 洛谷P2149 Elaxia的路线

    传送门啦 分析: 我最开始想的是跑两遍最短路,然后记录一下最短路走了哪些边(如果有两条最短路就选经过边多的),打上标记.两边之后找两次都标记的边有多少就行了. 但...我并没有实现出来. 最后让我们看 ...

  5. 洛谷——P2149 [SDOI2009]Elaxia的路线

    P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每 ...

  6. 洛谷 P2149 [SDOI2009]Elaxia的路线

    题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的 ...

  7. 洛谷—— P2149 [SDOI2009]Elaxia的路线

    https://www.luogu.org/problem/show?pid=2149 题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两 ...

  8. 洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 && 乱搞

    题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...

  9. 洛谷 P5663 加工零件 & [NOIP2019普及组] (奇偶最短路)

    传送门 解题思路 很容易想到用最短路来解决这一道问题(题解法),因为两个点之间可以互相无限走,所以如果到某个点的最短路是x,那么x+2,x+4也一定能够达到. 但是如何保证这是正确的呢?比如说到某个点 ...

随机推荐

  1. PostgreSQL重新读取pg_hba.conf文件

    PostgreSQL  配置文件之pg_hba.conf 该文件用于控制访问安全性,管理客户端对于PostgreSQL服务器的访问权限,内容包括:允许哪些用户连接到哪个数据库,允许哪些IP或者哪个网段 ...

  2. day10-02_多线程之进程与线程的pid

    一.多个线程之间PID的区别 主进程跟线程的pid是一样的 from threading import Thread from multiprocessing import Process impor ...

  3. 用select提取List元素自身序号

    var cs = currentCitys.Select((c, i) => new { id = c.CITY_ID, 序号 = (i + 1).ToString(), 城市类型 = c.IS ...

  4. POJ-2502_Subway

    Subway Time Limit: 1000MS Memory Limit: 65536K Description You have just moved from a quiet Waterloo ...

  5. oracle中的闪回

    项目中运用: 首先说明:闪回方法有一个前提,就是需要尽早的发现问题,果断的采取行动.若误操作的记录已经在UNDO表空间中被清除,则此方法就不可行了,需要另寻他法. 例如: SELECT * FROM ...

  6. 项目中遇到的undo表空间不足的替换

    1.查找数据库的UNDO表空间名                                      select name from v$tablespace;                 ...

  7. Project Euler Problem 26-Reciprocal cycles

    看样子,51nod 1035 最长的循环节 这道题应该是从pe搬过去的. 详解见论文的(二)那部分:http://web.math.sinica.edu.tw/math_media/d253/2531 ...

  8. JVM参数详细列表

    -client :设置JVM使用client模式,特点启动较快(神机不明显(I5/8G/SSD)) -server :设置JVM使用server模式.64位JDK默认启动该模式 -agentlib:l ...

  9. uva 100 The 3n + 1 problem (RMQ)

    uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem= ...

  10. ThinkPHP3.2版本安全更新

    近日我们收到了一个关于3.2版本的漏洞提醒,官方已经第一时间进行处理和更新.由于3.2版本已经过了官方的维护和安全更新周期,而且大量的开发者也进行了二次开发,因此不再发布新版,官方仅进行安全公告和修复 ...