HDU 5521 Meeting 拆點 最短路

2022-08-19 08:12:09 字數 1413 閱讀 5280

題目鏈結

給m個由圖中結點組成的點集,點集中的點兩兩連通且距離為相等的ti。現有兩人分別從1和n點處同時出發嗎,問能否相遇以及相遇的最短時間。

很容易想到直接分別以點1和點n為起始點求最短路,再遍歷各個點即可求得最短相遇時間。然而建圖上卻有問題:這個題中的邊是以點集的形式給出,極端情況下可能會出現有1e12條邊的稠密圖。

這時就要利用點集中的點之間距離相等這個性質,拆點來建圖。將點集抽象成乙個點,將點集中的每個連一條長為ti/2的邊到這個點集的點。這樣做可以大大減少邊的數量。另外為了防止出現浮點數,可以直接把每個邊變成ti而不是ti/2最後在最短時間上除以2就可以了

//hdu 5521 meeting

//ac 2016-08-10 16:43:30

//shortest path

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define cls(x) memset(x,0,sizeof x)

#define inf(x) memset(x,0x3f,sizeof x)

#define neg(x) memset(x,-1,sizeof x)

#define ninf(x) memset(x,0xc0,sizeof x)

#define st0(x) memset(x,false,sizeof x)

#define st1(x) memset(x,true,sizeof x)

#define inf 0x3f3f3f3f

#define lowbit(x) x&(-x)

#define input(x) scanf("%d",&(x))

#define bug cout<<"here"int t;

int n,m;

struct node

}p,q;

vector

g[1100100];

int dist1[1100100],dist2[1100100];

void dijkstra(int beg,int dist)}}

return;

}int main()

}putchar('\n');}}

return

0;}

HDU 5521 Meeting 拆點 最短路

題目鏈結 給m個由圖中結點組成的點集,點集中的點兩兩連通且距離為相等的ti。現有兩人分別從1和n點處同時出發嗎,問能否相遇以及相遇的最短時間。很容易想到直接分別以點1和點n為起始點求最短路,再遍歷各個點即可求得最短相遇時間。然而建圖上卻有問題 這個題中的邊是以點集的形式給出,極端情況下可能會出現有1...

hdu5521 二維最短路,集合或者拆點

給定乙個圖,每個集合內部的點相互到達的話費是一定的,兩個人分別在1和m點上,問你他們倆到達某些點最小的花費,如果有好多點可以供選擇,就按從小到大的順序輸出那些點。1 如果相互建邊感覺肯定太多了建不了。畢竟是n!2 這道題還考察對鄰接表的理解,鄰接表上的各行元素代表和這個點有相互連線的關係,我們可以讓...

HDU 5521 巧妙地最短路

題意 n個點,m塊,塊的意思就是說,在塊中的點任意兩點的距離都是t,問分別從1點和n點走到某個點,這個點的花費就是二者較大的,問這n個點花費最小是多少,並按字典序列印序號 思路 這題頭疼的就是不知道怎麼建圖,暴力建圖會超記憶體,有乙個巧妙的方法是 將這個塊中的點全部連到乙個點上,每條邊花費t 2,這...