比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAA
题目名称 P服务点设置 最终得分 100
用户昵称 森林 运行时间 0.182 s
代码语言 C++ 内存使用 0.36 MiB
提交时间 2016-10-07 16:40:54
显示代码纯文本
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<stdlib.h>
#include<iomanip>
#include<string.h>
#include<math.h>
#define WJ(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
#define JW fclose(stdin);fclose(stdout);
using namespace std;
const int maxn=110;
int n,m,p,dis[maxn][maxn],order[maxn]={0},tot=0x3f3f3f3f,ans[maxn]={0},mmax=0,a=0;
bool flag[maxn]={0};
inline void QR(int& x){
	char ch;int f=1;
	while(ch=getchar(),ch<'0'||ch>'9')if(ch=='-')f=-1;
	x=ch-48;
	while(ch=getchar(),'0'<=ch&&ch<='9')x=x*10+ch-48;
	x*=f;
}
inline void QW(int num){
	if(num<0)putchar('-'),num=-num;
	int cnt=0;char str[30];
	while(str[++cnt]=num%10+48,num/=10);
	while(putchar(str[cnt]),--cnt);
}
void find(int c){
	if(c==p+1){
		mmax=0;
		for(int k=0;k<n;k++){
			a=0x7fffffff;
			for(int i=1;i<=p;i++)a=min(a,dis[order[i]][k]);
			mmax=max(mmax,a);
		}
		if(mmax<tot){
			tot=mmax;
			for(int i=1;i<=p;i++)ans[i]=order[i];
		}
		return;
	}
	for(int i=0;i<n;i++){
		if(!flag[i])flag[i]=1,order[c]=i,find(c+1),flag[i]=0;
	}
}
int main(){
	WJ(djsc);
	QR(n),QR(m),QR(p);
	int x,y,z;
	memset(dis,0x3f,sizeof(dis));
	for(int i=1;i<=m;i++){
		QR(x),QR(y),QR(z);
		dis[x][y]=dis[y][x]=min(z,dis[x][y]);
	}
	for(int k=0;k<n;k++)dis[k][k]=0;
	for(int k=0;k<n;k++)
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
	find(1);
	sort(ans+1,ans+1+p);
	for(int i=1;i<=p;i++)QW(ans[i]),putchar(' ');
	JW;
	return 0;
}