Advertisement
nullzero

kampanja

Jul 14th, 2012
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4.  
  5. #define MAXN 105
  6. #define MYINF 1000000
  7. #define S 0
  8. #define T 1
  9.  
  10. using namespace std;
  11.  
  12. int dist[MAXN][MAXN];
  13. int ans[MAXN][MAXN];
  14. bool solved[MAXN][MAXN];
  15.  
  16. int main (){
  17.     int n, m;
  18.     cin >> n >> m;
  19.     for(int i = 0; i < m; i++){
  20.         int x, y;
  21.         cin >> x >> y;
  22.         x--;
  23.         y--;
  24.         dist[x][y] = 1;
  25.     }
  26.    
  27.     for(int i = 0; i < n; i++)
  28.         for(int j = 0; j < n; j++)
  29.             if(i != j and dist[i][j] == 0) dist[i][j] = MYINF;
  30.            
  31.     for(int k = 0; k < n; k++)
  32.         for(int i = 0; i < n; i++)
  33.             for(int j = 0; j < n; j++)
  34.                 dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
  35.    
  36.     memset(ans, MYINF, sizeof(ans));
  37.     ans[S][S] = 1; // let ans[i][j] be minimal nodes that have to pass when travel from i => 1 => j
  38.    
  39.     while(not solved[T][T]){
  40.         int i = -1;
  41.         int j = -1;
  42.         int minvalue = MYINF;
  43.        
  44.         for(int x = 0; x < n; x++){
  45.             for(int y = 0; y < n; y++){
  46.                 if((not solved[x][y]) and (ans[x][y] < minvalue)){
  47.                     i = x;
  48.                     j = y;
  49.                     minvalue = ans[x][y];
  50.                 }
  51.             }
  52.         }
  53.  
  54.         solved[i][j] = true;
  55.        
  56.         for(int x = 0; x < n; x++){
  57.             for(int y = 0; y < n; y++){
  58.                 if(not solved[x][y]){
  59.                     int minnode = dist[x][i] + ans[i][j] + dist[j][y]; // case 1: x => (i => j) => y
  60.                    
  61.                     if(x == y) minnode--; // case 2: x => (i => j) => x
  62.                     else if(y != i and j != x) // case 3: x => y => i => (i => j) => x
  63.                         minnode = min(minnode, dist[x][y] + dist[y][i] + ans[i][j] + dist[j][x] - 1);
  64.                    
  65.                     ans[x][y] = min(ans[x][y], minnode);
  66.                 }
  67.             }
  68.         }
  69.     }
  70.     cout << ans[T][T] << endl;
  71.     return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement