Problem p01317 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stdio.h>
#include <string>
#include <vector>

using namespace std;

#define EPS (1e-10)
#define EQ(a, b) (abs((a) - (b)) < EPS)
#define EQV(a, b) (EQ((a).real(), (b).real()) && EQ((a).imag(), (b).imag()))

typedef long long ll;

const int INF = 500000000;
const int MAX_V = 210;
const int MAX_R = 1010;
int n, m, r;
int land[MAX_V][MAX_V];
int sea[MAX_V][MAX_V];
int citys[MAX_R];
void calcLandMinDist() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        land[j][k] = min(land[j][k], land[j][i] + land[i][k]);
}
void calcSeaMinDist() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        sea[j][k] = min(sea[j][k], sea[j][i] + sea[i][k]);
}
int dp[MAX_R][MAX_V];
// WzæªidxÌÔÚÌÆ±ëÅA{[gªboatÌm[hÉ éÆ«ÌÅ¬zBÔ
int rec(int idx, int boat) {
  if (idx == r)
    return 0;
  if (dp[idx][boat] != INF)
    return dp[idx][boat];
  int minTime = INF;
  // ¤ÌÝðgÁÄB·éê
  minTime = min(minTime, rec(idx + 1, boat) + land[citys[idx - 1]][citys[idx]]);
  // CàgÁÄB·éê
  // »ÝÌboatÌÊu©çBÅ«é`¬·×ÄÉÂ¢Ä·
  for (int i = 0; i < n; i++) {
    minTime = min(minTime, rec(idx + 1, i) + land[citys[idx - 1]][boat] +
                               sea[boat][i] + land[i][citys[idx]]);
  }
  return dp[idx][boat] = minTime;
}

int main() {
  while (cin >> n >> m && !(n == 0 && m == 0)) {
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        if (i == j)
          land[i][j] = sea[i][j] = 0;
        else
          land[i][j] = sea[i][j] = INF;
    for (int i = 0; i < m; i++) {
      int from, to, cost;
      char kind;
      cin >> from >> to >> cost >> kind;
      from--;
      to--;
      if (kind == 'L') {
        land[from][to] = min(land[from][to], cost);
        land[to][from] = min(land[to][from], cost);
      } else {
        sea[from][to] = min(sea[from][to], cost);
        sea[to][from] = min(sea[to][from], cost);
      }
    }
    cin >> r;
    for (int i = 0; i < r; i++) {
      cin >> citys[i];
      citys[i]--;
    }
    calcLandMinDist();
    calcSeaMinDist();
    // dpÅÅZ£ðßé
    for (int i = 0; i < r; i++)
      for (int j = 0; j < n; j++)
        dp[i][j] = INF;
    dp[0][citys[0]] = 0;
    // Wzæ
    for (int i = 1; i < r; i++) {
      // ¡Ì{[gÌê
      for (int j = 0; j < n; j++) {
        dp[i][j] = min(dp[i][j], dp[i - 1][j] + land[citys[i - 1]][citys[i]]);
        // Ì{[gÌê
        for (int k = 0; k < n; k++) {
          dp[i][k] = min(dp[i][k], dp[i - 1][j] + land[citys[i - 1]][j] +
                                       sea[j][k] + land[k][citys[i]]);
        }
      }
    }
    // int res=rec(1,citys[0]);
    int res = INF;
    for (int i = 0; i < n; i++)
      res = min(res, dp[r - 1][i]);
    cout << res << endl;
  }
  return 0;
}
/*
Èº¦ÍÅ«P[XÅªöxÅoÍ³êéªAAOJÅÍà¿ëñTLE·éR[h
_CNXg@ðgpµÄð¼Éð¢Ä¢é
*/
// struct edge{
//	int to;
//	int cost;
//     char kind;
// };
//
// class Situation{
// public:
//	int cost;
//	int node;
//     int boat;
//     int obj;
//
//	Situation(int cost_,int node_,int boat_,int obj_){
//		cost=cost_;
//         node=node_;
//         boat=boat_;
//         obj=obj_;
//	}
//	Situation();
//
//	bool operator<(const Situation &s)const{
//		return s.cost < this->cost;
//	}
// };
//
// int V;
// int n,m;
//
// vector<int> objLands;
//
// const int MAX_V = 205;
// const int MAX_M = 1001;
// vector<edge> G[MAX_V];
// int d[MAX_V][MAX_M][MAX_V];
// const int INF = 1000000000;
//
// void dijkstra(int s){
//	priority_queue<Situation> que;
//     for(int i = 0; i < MAX_V; i++)
//         for(int j = 0; j < MAX_M; j++)
//             for(int k = 0; k < MAX_V; k++)
//                 d[i][j][k]=INF;
//     d[s][0][s] = 0;
//     que.push(Situation(0,s,s,0));
//	while(!que.empty()){
//		Situation p = que.top();
//		que.pop();
//         int node=p.node;
//         int boat=p.boat;
//         int cost=p.cost;
//         int obj=p.obj;
//         //
//         ¡ñÈOÉß½»ÝÌÊuÌRXgÌûª¬³¢
//		if(d[node][obj][boat] < cost)
//             continue;
//		for(int i = 0; i < G[node].size(); i++){
//			edge &e = G[node][i];
//             int toObj=obj;
//             //
//             Ú®n_Ìm[hªÚInÅ éêAÚInð©ßé
//             if(objLands[obj]==e.to)
//                 toObj++;
//             // ¤ÌêÆCÌêÅêí¯
//             if(e.kind=='L'){
//                 // ÅZ£
//                 if(d[e.to][toObj][boat]>d[node][obj][boat]+e.cost){
//                     d[e.to][toObj][boat]=d[node][obj][boat]+e.cost;
//                     if(toObj!=objLands.size())
//                         que.push(Situation(d[e.to][toObj][boat],e.to,boat,toObj));
//                 }
//             }
//             else{
//                 //
//                 CoRÅÚ®·é½ßÉÍA»ÝÌêÉDª é±ÆªKv
//                 if(boat==node){
//                     if(d[e.to][toObj][e.to]>d[node][obj][boat]+e.cost){
//                         d[e.to][toObj][e.to]=d[node][obj][boat]+e.cost;
//                         if(toObj!=objLands.size())
//                             que.push(Situation(d[e.to][toObj][e.to],e.to,e.to,toObj));
//                     }
//                 }
//             }
//		}
//	}
// }
//
// int main(){
//
//     while(cin>>n>>m&&!(n==0&&m==0)){
//         objLands.clear();
//         for(int i = 0; i < MAX_V; i++)
//             G[i].clear();
//         for(int i = 0; i < m; i++){
//             int from,to,cost;
//             char c;
//             cin>>from>>to>>cost>>c;
//             from--;to--;
//             edge e;
//             e.cost=cost;e.kind=c;e.to=to;
//             G[from].push_back(e);
//             e.to=from;
//             G[to].push_back(e);
//         }
//         int t;
//         cin>>t;
//         int s;
//         for(int i = 0; i < t; i++){
//             if(i==0){
//                 cin>>s;
//                 s--;
//             }
//             else{
//                 int b;
//                 cin>>b;
//                 b--;
//                 objLands.push_back(b);
//             }
//         }
//         dijkstra(s);
//         int minCost=INF;
//         for(int i = 0; i < n; i++){
//             for(int j = 0; j < n; j++)
//                 minCost=min(minCost,d[objLands[objLands.size()-1]][objLands.size()][j]);
//         }
//         cout<<minCost<<endl;
//     }
//     return 0;
// }

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <complex>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stdio.h>
#include <string>
#include <vector>

using namespace std;

#define EPS (1e-10)
#define EQ(a, b) (abs((a) - (b)) < EPS)
#define EQV(a, b) (EQ((a).real(), (b).real()) && EQ((a).imag(), (b).imag()))

typedef long long ll;

const int INF = 100000000;
const int MAX_V = 201;
int n, m, r;
int land[MAX_V][MAX_V];
int sea[MAX_V][MAX_V];
int citys[1001];
void calcLandMinDist() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        land[j][k] = min(land[j][k], land[j][i] + land[i][k]);
}
void calcSeaMinDist() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      for (int k = 0; k < n; k++)
        sea[j][k] = min(sea[j][k], sea[j][i] + sea[i][k]);
}
int dp[1001][201];
// WzæªidxÌÔÚÌÆ±ëÅA{[gªboatÌm[hÉ éÆ«ÌÅ¬zBÔ
int rec(int idx, int boat) {
  if (idx == r)
    return 0;
  if (dp[idx][boat] != INF)
    return dp[idx][boat];
  int minTime = INF;
  // ¤ÌÝðgÁÄB·éê
  minTime = min(minTime, rec(idx + 1, boat) + land[citys[idx - 1]][citys[idx]]);
  // CàgÁÄB·éê
  // »ÝÌboatÌÊu©çBÅ«é`¬·×ÄÉÂ¢Ä·
  for (int i = 0; i < n; i++) {
    minTime = min(minTime, rec(idx + 1, i) + land[citys[idx - 1]][boat] +
                               sea[boat][i] + land[i][citys[idx]]);
  }
  return dp[idx][boat] = minTime;
}

int main() {
  while (cin >> n >> m && !(n == 0 && m == 0)) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (i == j)
          land[i][j] = sea[i][j] = 0;
        else
          land[i][j] = sea[i][j] = INF;
      }
    }
    for (int i = 0; i < m; i++) {
      int from, to, cost;
      char kind;
      cin >> from >> to >> cost >> kind;
      from--;
      to--;
      if (kind == 'L')
        land[from][to] = land[to][from] = cost;
      else
        sea[from][to] = sea[to][from] = cost;
    }
    cin >> r;
    for (int i = 0; i < r; i++) {
      cin >> citys[i];
      citys[i]--;
    }
    calcLandMinDist();
    calcSeaMinDist();
    // dpÅÅZ£ðßé
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        dp[i][j] = INF;
    int res = rec(1, citys[0]);
    cout << res << endl;
  }

  return 0;
}
/*
Èº¦ÍÅ«P[XÅªöxÅoÍ³êéªAAOJÅÍà¿ëñTLE·éR[h
_CNXg@ðgpµÄð¼Éð¢Ä¢é
*/
// struct edge{
//	int to;
//	int cost;
//     char kind;
// };
//
// class Situation{
// public:
//	int cost;
//	int node;
//     int boat;
//     int obj;
//
//	Situation(int cost_,int node_,int boat_,int obj_){
//		cost=cost_;
//         node=node_;
//         boat=boat_;
//         obj=obj_;
//	}
//	Situation();
//
//	bool operator<(const Situation &s)const{
//		return s.cost < this->cost;
//	}
// };
//
// int V;
// int n,m;
//
// vector<int> objLands;
//
// const int MAX_V = 205;
// const int MAX_M = 1001;
// vector<edge> G[MAX_V];
// int d[MAX_V][MAX_M][MAX_V];
// const int INF = 1000000000;
//
// void dijkstra(int s){
//	priority_queue<Situation> que;
//     for(int i = 0; i < MAX_V; i++)
//         for(int j = 0; j < MAX_M; j++)
//             for(int k = 0; k < MAX_V; k++)
//                 d[i][j][k]=INF;
//     d[s][0][s] = 0;
//     que.push(Situation(0,s,s,0));
//	while(!que.empty()){
//		Situation p = que.top();
//		que.pop();
//         int node=p.node;
//         int boat=p.boat;
//         int cost=p.cost;
//         int obj=p.obj;
//         //
//         ¡ñÈOÉß½»ÝÌÊuÌRXgÌûª¬³¢
//		if(d[node][obj][boat] < cost)
//             continue;
//		for(int i = 0; i < G[node].size(); i++){
//			edge &e = G[node][i];
//             int toObj=obj;
//             //
//             Ú®n_Ìm[hªÚInÅ éêAÚInð©ßé
//             if(objLands[obj]==e.to)
//                 toObj++;
//             // ¤ÌêÆCÌêÅêí¯
//             if(e.kind=='L'){
//                 // ÅZ£
//                 if(d[e.to][toObj][boat]>d[node][obj][boat]+e.cost){
//                     d[e.to][toObj][boat]=d[node][obj][boat]+e.cost;
//                     if(toObj!=objLands.size())
//                         que.push(Situation(d[e.to][toObj][boat],e.to,boat,toObj));
//                 }
//             }
//             else{
//                 //
//                 CoRÅÚ®·é½ßÉÍA»ÝÌêÉDª é±ÆªKv
//                 if(boat==node){
//                     if(d[e.to][toObj][e.to]>d[node][obj][boat]+e.cost){
//                         d[e.to][toObj][e.to]=d[node][obj][boat]+e.cost;
//                         if(toObj!=objLands.size())
//                             que.push(Situation(d[e.to][toObj][e.to],e.to,e.to,toObj));
//                     }
//                 }
//             }
//		}
//	}
// }
//
// int main(){
//
//     while(cin>>n>>m&&!(n==0&&m==0)){
//         objLands.clear();
//         for(int i = 0; i < MAX_V; i++)
//             G[i].clear();
//         for(int i = 0; i < m; i++){
//             int from,to,cost;
//             char c;
//             cin>>from>>to>>cost>>c;
//             from--;to--;
//             edge e;
//             e.cost=cost;e.kind=c;e.to=to;
//             G[from].push_back(e);
//             e.to=from;
//             G[to].push_back(e);
//         }
//         int t;
//         cin>>t;
//         int s;
//         for(int i = 0; i < t; i++){
//             if(i==0){
//                 cin>>s;
//                 s--;
//             }
//             else{
//                 int b;
//                 cin>>b;
//                 b--;
//                 objLands.push_back(b);
//             }
//         }
//         dijkstra(s);
//         int minCost=INF;
//         for(int i = 0; i < n; i++){
//             for(int j = 0; j < n; j++)
//                 minCost=min(minCost,d[objLands[objLands.size()-1]][objLands.size()][j]);
//         }
//         cout<<minCost<<endl;
//     }
//     return 0;
// }