有段时间没做题了,这几天一直在寻找感觉,尽量多看书,这题目就是n个地方,编号从1到n,然后有r条路,问你从1号到达n号地方的次短路长度为多少,同一条边可以重复走,直接在dijkstra算法里同时记录一个次短路就可以了,但是一直WA,后来去看了讨论面板,那里有人给了测试数据,我不知道那数据的对错,但是干扰了我很久,也许那些数据实在题目案例之外的吧,对我的程序没有任何影响,我只是太久没错 一时 忘了双向边了,一开始只建立了单向边~代码写的也比较冗长~
int n,r;
typedef struct Node {
int to;
int val;
Node(int to,int val):to(to),val(val){}
};
vector<Node> G[10000 + 55];
int dis1[10000 + 55];
int dis2[10000 + 55];
void init() {
for(int i=0;i<10000 + 55;i++) {
dis1[i] = inf;
dis2[i] = inf;
G[i].clear();
}
}
bool input() {
while(cin>>n>>r) {
for(int i=0;i<r;i++) {
int u,v,w;
cin>>u>>v>>w;
u--,v--;
G[u].push_back(Node(v,w));
G[v].push_back(Node(u,w));
}
return false;
}
return true;
}
void dijkstra() {
priority_queue<pair<int ,int >,vector<pair<int ,int >>,greater<pair<int ,int >> > q;
dis1[0] = 0;
q.push(make_pair(0,0));
while(!q.empty()) {
pair<int ,int > p = q.top();
q.pop();
int v = p.second;
int d = p.first;
if(dis2[v] < d)continue;
for(int i=0;i<G[v].size();i++) {
Node e = G[v][i];
int dis = d + e.val;
if(dis1[e.to] > dis) {
swap(dis1[e.to],dis);
q.push(make_pair(dis1[e.to],e.to));
}
if(dis2[e.to] > dis && dis1[e.to] < dis) {
dis2[e.to] = dis;
q.push(make_pair(dis2[e.to],e.to));
}
}
}
}
void cal() {
dijkstra();
cout<<dis2[n - 1]<<endl;
}
void output() {
}
int main() {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}