有一个n各点的无向政权图 G,这个图是连通的,你知道了这些点两两之间的最短路的长度。
你想要构造一个新的无向政权图 G',使得新图中两两之间的最短路的长度与原图样,并且边数最少。求最少的边数。
废话少说直接上代码
#include<bits/stdc++.h>
#define INF 100000000
using namespace std;
int a[305][305],b[305][305];
bool flag1[305][305],flag2[305][305];
int main() {
int n;
cin >> n;
for(int i=1; i<=n; i++)
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
b[i][j]=a[i][j];
flag2[i][j]=flag1[i][j] =false;
}
for (int i = 1; i <= n; i++) {
int t = n-1;
while (t--) {
int min = INF;
int temp;
for (int j = 1; j <= n; j++)
if (i!=j&&!flag1[i][j] &&b[i][j] < min) {
min = b[i][j];
temp = j;
}
flag1[i][temp] = true;
for (int j = 1; j <= n; j++) {
if (i!=j&&!flag1[i][j] && b[i][j]>= b[i][temp] + a[temp][j]) {
b[i][j] = b[i][temp] + a[temp][j];
flag2[i][j] = true;
}
}
}
}
int e = n*(n - 1) / 2;
int cnt = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (flag2[i][j])
cnt++;
e = e-cnt / 2;
cout << e << endl;
return 0;
}