Network Mess UVA

来源:互联网 发布:js动态控制div的边框 编辑:程序博客网 时间:2024/05/29 19:43

一种类似于试探法。由于仅仅只能是计算机代表的节点才能是外部节点,那么就假设第一个节点是根节点,然后从第二个节点开始,逐步测试是否能够找到某个内部的节点,使得该内部节点到所有的已经加入的外部节点的距离与待加入的外部节点的距离之差相等,如果找到,就保存差值,逐步扩展并且计算,具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>#include<functional>using namespace std;const int MAX = 2005;int area[55][55];vector<int> R[MAX];int dist[MAX][55];int record[MAX];class Solve{public:int N;void Init(){memset(record,0,sizeof(record));for (int i = 1; i <= N; i++){for (int j = 1; j <= N; j++)cin >> area[i][j];}for (int i = 0; i < MAX; i++) R[i].clear();memset(dist, 0, sizeof(dist));}void dfs(int i,int pa,int k){for (int ind = 0; ind < R[i].size(); ind++){int v = R[i][ind];if (v == pa) continue;dist[v][k] = dist[i][k] + 1;dfs(v, i, k);}}void Deal(){Init();int amount = 1;for (int ind = 2; ind <= N; ind++){for (int i = 1; i <= amount; i++){int dis = area[ind][1] - dist[i][1];int j;for (j = 1; j < ind; j++){if (area[ind][j] - dist[i][j] != dis) break;}if (j == ind){while (dis > 0){amount++;R[amount].push_back(i);R[i].push_back(amount);record[amount]++;record[i]++;for (int k = 1; k < ind; k++){dist[amount][k] = dist[i][k] + 1;}dis--;i = amount;}dfs(i,0,ind);break;}}}sort(record+1,record+amount+1);for (int i = 1; i < amount; i++){if (record[i] > 1) cout << record[i] << " ";}cout << record[amount] << endl;}};int main(){Solve a;while (cin >> a.N){if (a.N == 0) break;a.Deal();}return 0;}