poj3268

来源:互联网 发布:淘宝客户信誉查询 编辑:程序博客网 时间:2024/06/06 01:33

集训第一周周末训练的迪杰斯特拉,求来回某点的最长时间,路是单向的,于是我把它做成从该点出发,用两种路走两遍



#include<iostream>#include<cstdio>#include<cstring>#include<cctype>#include<vector>#include<queue>#include<algorithm>using namespace std;const int NNN = 9999999;const int NN = 1050;int road[NN][NN];int road2[NN][NN];int dis[NN];int vis[NN];int N, M, K;int DDD[NN];void DIS(int x,int road[NN][NN]){int i;int j;int ans;int v;ans = NNN;dis[x] = 0;vis[x] = 1;for (i = 1; i <= N; i++)dis[i] = road[x][i];for (j = 1; j <= N; j++){ans = NNN;for (i = 1; i <= N; i++){if (dis[i] < ans && !vis[i]){ans = dis[i];v = i;}}vis[v] = 1;for (i = 1; i <= N; i++){dis[i] = min(dis[i], dis[v] + road[v][i]);}}}int main(){int i, j;int a, b;int x, y;while (cin >> N){a = b = x = y = 0;memset(dis, NNN, sizeof(dis));memset(vis, 0, sizeof(vis));memset(DDD, 0, sizeof(DDD));for (i = 0; i < NN; i++)for (j = 0; j < NN; j++){if (i != j){road[i][j] = NNN;road2[i][j] = NNN;}else{road[i][j] = 0;road2[i][j] = 0;}}cin >> M >> y;for (i = 0; i < M; i++){cin >> a >> b;cin >> road[a][b];road2[b][a] = road[a][b];}memset(dis, NNN, sizeof(dis));memset(vis, 0, sizeof(vis));DIS(y,road);for (i = 1; i <= N; i++)if (i != y){DDD[i] += dis[i];}memset(dis, NNN, sizeof(dis));memset(vis, 0, sizeof(vis));DIS(y, road2);for (i = 1; i <= N; i++)if (i != y){DDD[i] += dis[i];//cout << i << "  " << DDD[i] << endl;//cout << dis[i] << endl;}DDD[y] = 0;sort(DDD + 1, DDD + 1 + N);cout << DDD[N] << endl;}return 0;}


原创粉丝点击