比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAA
题目名称 P服务点设置 最终得分 100
用户昵称 AntiLeaf 运行时间 0.260 s
代码语言 C++ 内存使用 0.34 MiB
提交时间 2016-10-07 16:32:29
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
int n,m,p,x,y,dis[maxn][maxn],tmp,ds,ans=0x7ffffff;
bool used[maxn],b[maxn];
int main(){
	freopen("djsc.in","r",stdin);
	freopen("djsc.out","w",stdout);
	scanf("%d%d%d",&n,&m,&p);
	memset(dis,63,sizeof(dis));
	for(int i=1;i<=n;i++)dis[i][i]=0;
	while(m--){
		scanf("%d%d",&x,&y);
		x++;
		y++;
		scanf("%d",&dis[x][y]);
		dis[y][x]=dis[x][y];
	}
	for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
		dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
	for(int i=1;i<=p;i++)used[i]=true;
	for(int i=p+1;i<=n;i++)used[i]=false;
	do{
		tmp=0;
		for(int i=1;i<=n;i++){
			ds=0x7ffffff;
			for(int j=1;j<=n;j++)if(used[j])ds=min(ds,dis[i][j]);
			tmp=max(tmp,ds);
		}
		if(tmp<ans){
			ans=tmp;
			memcpy(b,used,sizeof(b));
		}
	}while(prev_permutation(used+1,used+n+1));
	for(int i=1;i<=n;i++)if(b[i])printf("%d ",i-1);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
/*
6 8 2
0 2 10
0 4 30
0 5 100
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
Answer:
0 3
*/