題目鏈結
就是求第乙個點到第n個點的次短路
第一次spfa用前驅記錄最短路
第二次spfa刪去最短路中的一條邊
記錄前驅開乙個pre陣列,在每次鬆弛操作時,如果d[i]被更新就pre[i]=j;表示當前到第i個點的最短路中,j是i的前驅節點
主函式中,從第n個點開始,即i=n,不斷地進行找前驅i=pre[i] 直到pre[i]=1,這個過程中的點連成路徑
為什麼要去掉最短路上的一條邊呢?
因為次短路和最短路至少有一條邊不是共有的,需要想想理解一下,,,
code
#include#include#include#include#include#include#includeusing namespace std;
const int maxn=208;
int n,m;
struct ppo[maxn];
struct re;
vectorg[maxn];
int pre[maxn];
double distance(int x1,int y1,int x2,int y2)
void spfa1()}}
} }double spfa2(int x,int y)}}
}return d[n];
}int main()
); g[qj].push_back((re));
}memset(pre,0,sizeof(pre));
spfa1();
int now=n;
while(pre[now]!=1)
double sxy=spfa2(now,1);
if(ans>sxy) ans=sxy;
if(ans==99999999) printf("-1");
else printf("%.2f",ans);
return 0;
}
洛谷P1491 集合位置
每次有大的活動,大家都要在一起 聚一聚 不管是去好樂迪,還是避風塘,或者湯姆熊,大家都要玩的痛快。還記得心語和花兒在跳舞機上的激情與釋放,還記得草草的投籃技藝是如此的高超,還記得狗狗的槍法永遠是 s 還有不能忘了,胖子的歌聲永遠是讓我們驚叫的!今天是野貓的生日,所以想到這些也正常,只是因為是上學日,...
洛谷P1491集合位置
這個題說白了就是求乙個次短路。方法是我們先跑一遍最短路,記錄下最短路上每乙個點的前驅。然後我們將最短路上每一條邊都標記一次,分別跑一邊最短路,求出最短路徑即可。在這我們不用特殊判斷是否是第二條次短路還是最短路。因為我們求出的 ans 是乙個最小值。include include include in...
洛谷P1491 集合位置
題目大意 求給定的一張無向帶權圖的次短路。題解 先跑一遍 spfa 求出從起點到終點的最短路,記錄路徑。接著列舉刪邊,並重新跑 spfa,統計最小值即可。至於為什麼 dp 做法不行,暫時還不清楚。如下 include using namespace std const int maxe 2e4 10...