題目鏈結
分析:
我一開始想了乙個自己都可以hack掉的演算法:
先來乙個樸素spfa
之後迴圈與終點相連的所有邊,
到達終點的距離就是dis[way[i].y]+way[i].v
統計最小的路徑和次小的路徑,輸出答案
竟然過掉了6個點
然後我就暴力搜尋,t了7個點,sto
好,我們來正經的
於是我又想了乙個做法,每個點都統計一下到達該點的最小距離和次小距離
但這好像不大現實
後來我才發現,這是一道次短路的裸題
又可以學習一種新演算法了
具體的做法引用一下byvoid大牛文章裡的一段話:
我們要對乙個有向賦權圖(無向圖每條邊可以看作兩條相反的有向邊)
的頂點s到t之間求次短路徑,首先應求出s的單源最短路徑
遍歷有向圖,標記出可以在最短路徑上的邊,加入集合k
然後列舉刪除集合k中每條邊,求從s到t的最短路徑,
記錄每次求出的路徑長度值,其最小值就是次短路徑的長度
在這裡我們認為次短路徑長度可以等於最短路徑長度,
如果相等,也可以看作是從s到t有不止一條最短路徑
如果我們規定求從s到t**大於最短路徑長度**的次短路徑,
則答案就是每次刪邊後大於原最短路徑的s到t的最短路徑長度的最小值
成功ac
這裡寫**片
#include
#include
#include
using namespace std;
const int inf=0x33333333;
const int n=10001;
ints,t,n,m;
struct node;
node way[n<<2];
int st[n],tot=0,ans1,ans2,dis[n],q[n],tou,wei,pre[n];
bool p[n];
void add(int u,int w,int z)
int spfa(int
s,int t)}}
p[r]=1;
}while (toureturn dis[t];
}int spfa2(int
s,int t)}}
p[r]=1;
}while (toureturn dis[t];
}int main()
ans1=spfa(s,t);
if (ans1==inf)
ans2=inf;
for (int i=t;i!=s;i=way[pre[i]].x) //記錄最短路
if (ans2==inf) printf("he will be cursed\n");
else
printf("%d\n",ans2);
return
0;
}
echarts 最近的新姿勢
經過我這幾個月的堅持學習,外加高人指點,對echarts,又稍稍有了一些新姿勢 總結一折線圖 line series 這個areastyle 應該是用來劃區域的,沒有它,折線圖應該就是單獨的線圖,我火星了 總結二折線圖 line option yaxis series 這個data還可以這麼玩,然後...
讀入優化新姿勢 學習筆記
震驚!99.9 的oier都不知道。用了此方法,暴力立馬變標算!最近學習了乙個新的函式fread,可以從檔案中整塊讀入資訊,速度很快。基於這個函式,我們可以寫乙個新的getchar inline char gc fread的4個引數分別表示從 開始存,乙個量是幾位元組 char就是1 想要讀入幾個,...
Linux 解鎖檔案操作新姿勢
作為乙個程式後台開發人員,往往會檢視程式執行的日誌來分析當前程式執行的情況及異常問題排查。那必不可少的是如何高效的操作日誌檔案 本人之前常用的命令一般為tail cat vi 或vim 要獲取錯誤日誌從何開始時可能要遍歷整個日誌檔案,使用cat缺省會快速翻到最後一行,若使用vi則把檔案都載入到記憶體...