有段时间没做题了,这几天一直在寻找感觉,尽量多看书,这题目就是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; }
时间: 2024-10-08 03:15:38