題目鏈結
給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,這...