Untitled

 avatar
unknown
plain_text
a year ago
6.7 kB
4
Indexable
ThanhTri, Frog, Farm, wellprj
//TanCongThanhTri
#include<iostream>

using namespace std;
#define SIZE 100
int N, answer, root;
int lienket[100][100] = {0};
int trongluong[100] = {0};
int visited[100] = {0};
int parent[100] = {0};
void clear_visit() {
 for(int i = 0; i < N; i++) {
  visited[i] = 0;
 }
}
int DFS(int k, int cha) {
 visited[k] = 1;
 parent[k] = cha;
 for(int i = 0; i < N; i++) {
  if(lienket[k][i]) { //ton tai khoang k->i
   if(!visited[i]) {
    if(DFS(i, k)) {
     return 1;
    }
   } else { //neu vi tri da visited va ko phai cha cua dinh hien tai. khi do se co 1 chu trinh
    if(i != cha && cha != -1 && i == root) {
     int sum = trongluong[k] + trongluong[i];
     int minValue = sum;
     int vStart = k;
     int vEnd = i;
     //tim canh be nhat trong chu trinh
     int x = k;
     while(parent[x] != -1) {
      sum = trongluong[x] + trongluong[parent[x]];
      if(sum < minValue) {
       minValue = sum;
       vStart = parent[x];
       vEnd = x;
      }
      x = parent[x];
     }
     lienket[vStart][vEnd] = lienket[vEnd][vStart] = 0; //bo canh nho nhat trong chu trinh
     answer += minValue;
     return 1;
    }
   }
  }
 }
 return 0;
}
int TC;
int main() {
 //freopen("Text.txt","r", stdin);
 int TC, idx, tmp, C;
 cin >> TC;
 for(int tc = 1; tc <= TC; tc++) {
  answer = 0;
  cin >> N;
  //reset
  for(int i = 0; i < N; i++) {
   for(int j = 0; j < N; j++) {
    lienket[i][j] = 0;
   }
  }
  //input data
  for(int i = 0; i < N; i++) {
   cin >> idx;
   cin >> trongluong[idx] >> C;
   for(int j = 0; j < C; j++) {
    cin >> tmp;
    lienket[idx][tmp] = 1;
    lienket[tmp][idx] = 1;
   }
  }
  answer = 0;
  for(int i = 0; i < N; i++) {
   clear_visit();
   root = i;
   if(DFS(i, -1)) i--;
  }
  cout << answer << endl;
 }
 return 0;
}

//TheFrog
#include<iostream>

using namespace std;
int tc, n, inf = 1000000000, lowE = 1, highE = 200;
int r[3][201], a[201][201];
int sqrtt(int x) {
 int i = 0;
 while(i * i < x) {
  i++;
 }
 return i;
}
int energyJump(int x1, int y1, int r1, int x2, int y2, int r2) {
 int e = sqrtt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) - r1 - r2;
 if(e <= 40) return lowE;
 else if(e <= 90) return highE;
 else return inf;
}
int findMinE() {
 bool selected[201] = {
  0
 };
 int selectedCnt = 0;
 int minEn[201];
 minEn[0] = 0;
 for(int i = 1; i < n; i++) {
  minEn[i] = inf;
 }
 int nearestLeaf = 0, nearestDist; //id và kho?ng cách c?a chi?c lá g?n nh?t
 while(selectedCnt < n) { //l?p cho đ?n khi t?t c? lá đ? đư?c ch?n
  //trong s? lá chưa ch?n, t?m cái có kho?ng cách g?n nh?t (tham lam)
  nearestDist = inf;
  for(int i = 0; i < n; i++) {
   if(!selected[i] && minEn[i] < nearestDist) {
    nearestDist = minEn[i];
    nearestLeaf = i;
   }
  }
  //Đi?u ki?n d?ng: lá đang thăm có kho?ng cách là INF, ho?c đ? g?p đư?c lá th? N - 1 (đích)
  if(nearestDist == inf || nearestLeaf == n - 1) break;
  //Đánh d?u thăm
  selectedCnt++;
  selected[nearestLeaf] = true;
  //C?p nh?t kho?ng cách c?a các lá có th? nh?y t?i t? lá đang thăm
  for(int i = 0; i < n; i++)
   if(!selected[i] && minEn[nearestLeaf] + a[nearestLeaf][i] < minEn[i]) minEn[i] = minEn[nearestLeaf] + a[nearestLeaf][i];
 }
 return minEn[n - 1];
}
int main() {
 freopen("input.txt", "r", stdin);
 cin >> tc;
 for(int t = 1; t <= tc; t++) {
  cin >> n;
  for(int i = 0; i < n; i++) {
   for(int j = 0; j < n; j++) {
    if(j == i) a[i][j] = 0;
    else a[i][j] = inf;
   }
  }
  for(int i = 0; i < n; i++) {
   cin >> r[0][i] >> r[1][i] >> r[2][i];
   for(int j = 0; j < i; j++) {
    a[i][j] = a[j][i] = energyJump(r[0][i], r[1][i], r[2][i], r[0][j], r[1][j], r[2][j]);
   }
  }
  int minE = findMinE();
  if(minE == inf) cout << -1 << endl;
  else cout << minE / highE << " " << minE % highE << endl;
 }
 return 0;
}

//BaoVeNongTrang
#include<iostream>
using namespace std;

const int MAX = 705;

int N,M; // L?n lư?t là s? lư?ng hàng, c?t c?a ma tr?n
int Answer; // K?t qu? là s? lư?ng đ?nh đ?i
int Map[MAX][MAX]; // B?n đ? c?a nông trang

bool Visit[MAX][MAX]; // Đánh d?u đ? ki?m tra đ? duy?t hay chưa
bool IsHill; // Đánh d?u xem có ph?i là đ?nh đ?i hay không

int drow[8] = {-1,-1,-1, 0,0, 1,1,1};
int dcol[8] = {-1, 0, 1,-1,1,-1,0,1};

void DFS(int row, int col)
{
 // T?i m?i đi?m ta s? đánh d?u đi?m đó đ? đư?c duy?t
 Visit[row][col] = true;

 for(int i = 0; i < 8; i++)
 {
  int r = row + drow[i];
  int c = col + dcol[i];

  if(r >= 0 && r < N && c >= 0 && c < M)
  {
   // T?i m?t đi?m mà t?n t?i 1 đi?m k? có giá tr? l?n hơn
   // th? đi?m đó không ph?i đ?nh đ?i
   if(IsHill && Map[r][c] > Map[row][col]) IsHill = false;

   // Duy?t t?i các đi?m có cùng đ? cao mà chưa đư?c duy?t
   // v? các đi?m đó s? thu?c cùng 1 đ?nh đ?i.
   if(Map[r][c] == Map[row][col] && !Visit[r][c]) DFS(r, c);
  }
 }
}

int main()
{
 //freopen("input.txt","r",stdin);
 ios::sync_with_stdio(false);

 // Nh?p đ?u vào
 cin >> N >> M;
 for(int i = 0; i < N; i++)
  for(int j = 0; j < M; j++)
  {
   cin >> Map[i][j];
   Visit[i][j] = false;
  }

 // Duy?t t?ng ph?n t? trong ma tr?n
 // và ki?m tra t?i ph?n t? chưa đư?c xét
 for(int i = 0; i < N; i++)
  for(int j = 0; j < M; j++)
   if(!Visit[i][j])
   {
    // Kh?i t?o IsHill = true, sau đó s? d?ng thu?t toán DFS
    // đ? duy?t ma tr?n. Sau quá tr?nh duy?t, n?u như IsHill v?n có
    // giá tr? true th? ch?ng t? đi?m v?a xét là đ?nh đ?i.
    IsHill = true;
    DFS(i, j);
    if(IsHill) Answer++;
   }

 // In k?t qu? s? đ?nh đ?i
 cout << Answer << endl;

 return 0;
}

//welProject
#define _CRT_SECURE_NO_WARNINGS
#define SIZE 109#include<iostream>

using namespace std;
int visit[SIZE];
int A[SIZE][SIZE];
int countdown;
int Answer;
int i, j;
int mini;
int jmini;
int main(int argc, char ** argv) {
 int test_case;
 int T, N;
 ios::sync_with_stdio(false);
 //freopen("Well Project.txt", "r", stdin);
 cin >> T;
 for(test_case = 1; test_case <= T; ++test_case) {
  Answer = 0;
  cin >> N;
  for(i = 1; i <= N; i++) {
   for(j = 1; j <= N; j++) {
    cin >> A[i][j];
   }
   visit[i] = 0;
  }
  // PRIM
  // Add 1st vertex to MST
  visit[1] = 1;
  countdown = 1;
  //Add one by one vertex to MST
  while(countdown < N) {
   //Find the minimum weight vertex
   mini = 1000000;
   for(i = 1; i <= N; i++) {
    if(visit[i] == 1) {
     for(j = 1; j <= N; j++) {
      if(j != i && visit[j] == 0) {
       if(A[i][j] < mini) {
        mini = A[i][j];
        jmini = j;
       }
      }
     }
    }
   }
   visit[jmini] = 1;
   Answer += mini;
   countdown++;
  }
  cout << "Case #" << test_case << endl << Answer << endl;
 }
 return 0;
}
Editor is loading...
Leave a Comment