每次有大的活動,大家都要在一起「聚一聚」,不管是去好樂迪,還是避風塘,或者湯姆熊,大家都要玩的痛快。還記得心語和花兒在跳舞機上的激情與釋放,還記得草草的投籃技藝是如此的高超,還記得狗狗的槍法永遠是's'……還有不能忘了,胖子的歌聲永遠是讓我們驚叫的!!
今天是野貓的生日,所以想到這些也正常,只是因為是上學日,沒法一起去玩了。但回憶一下那時的甜蜜總是一種幸福嘛。。。
但是每次集合的時候都會出現問題!野貓是公認的「路盲」,野貓自己心裡也很清楚,每次都提前出門,但還是經常遲到,這點讓大家很是無奈。後來,野貓在每次出門前,都會向花兒諮詢一下路徑,根據已知的路徑中,總算能按時到了。
現在提出這樣的乙個問題:給出n個點的座標,其中第乙個為野貓的出發位置,最後乙個為大家的集合位置,並給出哪些位置點是相連的。野貓從出發點到達集合點,總會挑一條最近的路走,如果野貓沒找到最近的路,他就會走第二近的路。請幫野貓求一下這條第二最短路徑長度。
輸入格式:
第一行是兩個整數n(1<=n<=200)和m,表示一共有n個點和m條路,以下n行每行兩個數xi,yi,(-500<=xi,yi<=500),代表第i個點的座標,再往下的m行每行兩個整數pj,qj,(1<=pj,qj<=n),表示兩個點相通。
輸出格式:
只有一行包含乙個數,為第二最短路線的距離(保留兩位小數),如果存在多條第一短路徑,則答案就是第一最短路徑的長度;如果不存在第二最短路徑,輸出-1。
輸入樣例#1:
3 30 01 1
0 21 2
1 32 3
輸出樣例#1:
2.83
各個測試點1s
注:此題有毒。。。
不能用 k短路。。。
即:不能走過一條邊後又走回來。。。
坑。。。
所以,spfa,再每次刪去最短路上一條邊,跑spfa,求最小值。
附**:
#include#include#include#include#include#include#define maxn 210
#define maxm 40010
#define max 1e9
using namespace std;
int n,m,s,t,k,c=2;
int head[maxn],fa[maxn];
double ans,path[maxn];
bool flag=true,vis[maxn];
struct node1a[maxm<<1];
struct node2b[maxn];
inline int read()
while(c>='0'&&c<='9')
return date*w;
}inline double dis(int i,int j)
inline int relax(int u,int v,double w)
return 0;
}inline void add(int u,int v,double w)
void spfa()
path[s]=0;
vis[s]=true;
q.push(s);
while(!q.empty())
} }}int main()
for(int i=1;i<=m;i++)
spfa();
flag=false;ans=max;
if(path[t]==max)
for(int i=t;i!=s;i=fa[i])
for(int j=head[i];j;j=a[j].next)
}if(ans!=max)printf("%.2lf\n",ans);
else printf("-1\n");
return 0;
}
洛谷P1491集合位置
題目鏈結 就是求第乙個點到第n個點的次短路 第一次spfa用前驅記錄最短路 第二次spfa刪去最短路中的一條邊 記錄前驅開乙個pre陣列,在每次鬆弛操作時,如果d i 被更新就pre i j 表示當前到第i個點的最短路中,j是i的前驅節點 主函式中,從第n個點開始,即i n,不斷地進行找前驅i pr...
洛谷P1491集合位置
這個題說白了就是求乙個次短路。方法是我們先跑一遍最短路,記錄下最短路上每乙個點的前驅。然後我們將最短路上每一條邊都標記一次,分別跑一邊最短路,求出最短路徑即可。在這我們不用特殊判斷是否是第二條次短路還是最短路。因為我們求出的 ans 是乙個最小值。include include include in...
洛谷P1491 集合位置
題目大意 求給定的一張無向帶權圖的次短路。題解 先跑一遍 spfa 求出從起點到終點的最短路,記錄路徑。接著列舉刪邊,並重新跑 spfa,統計最小值即可。至於為什麼 dp 做法不行,暫時還不清楚。如下 include using namespace std const int maxe 2e4 10...