计蒜客 蒜厂年会

 floyd算法的简单应用,刚开始一直没有通过,试了几组样例,才发现边的插入有问题,只有当a[j]!=a[j]时才插入

#include<bits/stdc++.h>
using namespace std;
const int MAX_N=310;
int g[MAX_N][MAX_N];
const int inf=0x3f3f3f3f;
int n,m;
void init(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j){
				g[i][j]=0;
			}else{
				g[i][j]=inf;
			}
		}
	}
}
void insert(int u,int v,int w){
	g[u][v]=g[v][u]=w;
}
void floyd(){
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(g[i][j]>g[i][k]+g[k][j]){
					g[i][j]=g[i][k]+g[k][j];
				}
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	init();
	int x;
	int a[MAX_N];
	//对输入的数据进行处理 
	for(int i=1;i<=m;i++){
		scanf("%d",&x);
		for(int j=1;j<=x;j++){
			scanf("%d",&a[j]);
		}
		for(int j=1;j<x;j++){
			for(int k=j+1;k<=x;k++){
				if(a[j]!=a[k])
				insert(a[j],a[k],1);
			}
		}
	} 
	floyd();
	int minx=inf,sum;
	for(int i=1;i<=n;i++){
		sum=0;
		for(int j=1;j<=n;j++){
			sum+=g[i][j];
		}
		if(sum<minx){
			minx=sum;
		}
	}
	double ss=(minx*1.0/(n-1));
	int cnt=int(ss*100);
	printf("%d\n",cnt);
	/*double t=n;
	cout<<int((minx / (t-1)) * 100)<<endl;*/
	return 0;
}

猜你喜欢

转载自blog.csdn.net/amf12345/article/details/89057221