首页 > 代码库 > POJ3255 Roadblocks 次短路Dijkstra做法

POJ3255 Roadblocks 次短路Dijkstra做法

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


POJ3255 Roadblocks 次短路Dijkstra做法