AOJ 0244 - Hot Spring Trip

時間はかかったけど自分で解けた.嬉しい.
dijkstra法っぽい気がしたけど,違う気もする.

#include<iostream>
#include<vector>

struct Edge{
	int to, cost;
};

const int INF = 1 << 24;
int n, m;
int d[2][100];
std::vector<Edge> es[100];

void dijkstra(int s){
	int used[2][100];
	for(int i=0;i<2;i++){
		for(int j=0;j<n;j++){
			used[i][j] = 0;
			d[i][j] = INF;
		}
	}

	d[0][s] = 0;

	while(true){
		int u = -1, v;
		for(int i=0;i<2;i++){
			for(int j=0;j<n;j++){
				if(!used[i][j] && (u == -1 || d[i][j] < d[u][v])){
					u = i;
					v = j;
				}
			}
		}

		if(u == -1)break;
		used[u][v] = 1;

		for(int i=0;i<es[v].size();i++){
			Edge e1 = es[v][i];
			d[u][e1.to] = std::min(d[u][e1.to], d[u][v]+e1.cost);
			for(int j=0;j<es[e1.to].size();j++){
				Edge e2 = es[e1.to][j];
				if(v != e2.to && u == 0){
					d[1][e2.to] = std::min(d[1][e2.to], d[0][v]);
				}
			}
		}
	}
}

int main(){
	while(std::cin >> n >> m, n){
		for(int i=0;i<n;i++){
			es[i].clear();
		}
		for(int i=0;i<m;i++){
			int a, b, c;
			std::cin >> a >> b >> c;
			es[a-1].push_back({b-1, c});
			es[b-1].push_back({a-1, c});
		}

		dijkstra(0);

		std::cout << std::min(d[0][n-1], d[1][n-1]) << std::endl;
	}
}