题目1 : Emulator
时间限制:
5000ms
单点时限:
1000ms
内存限制:
256MB
-
4 0 1 3 6 1 0 2 5 3 2 0 3 6 5 3 0
样例输出
-
3
-
第一眼看过去的感觉要用到floyd的过程,于是再跑一遍floyd,如果a[i][j]比跑出来的mindis还要小,就说明是一条必备的边;
-
#include<bits/stdc++.h> using namespace std; #define MAXN 305 int a[MAXN][MAXN]; int e[MAXN][MAXN]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; } } memset(e,0,sizeof(e)); int cnt=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { int mindis=0x3f3f3f3f; for(int k=1;k<=n;k++) { if(k==i||k==j) continue; mindis=min(a[i][k]+a[k][j],mindis); } if(a[i][j]<mindis) cnt++; } } cout<<cnt; return 0; }
描述
有一个n个点的无向正权图G,这个图是连通的,小Y知道这些点两两之间的最短路的长度。
小J想要构造一个新的无向正权图G',使得新图中两两之间的最短路的长度与原图一样,并且边数最少。
输入
第一行一个整数n,表示点的个数。
接下来n行,每行n个整数。第i行第j个整数表示i点到j点的在G中的最短路长度,保证合法。
1<=n<=300,保证图G中最短路长度不超过109。
输出
一个整数表示新图G'的最小的边数。