记录编号 69260 评测结果 AAAAAAAAAA
题目名称 P服务点设置 最终得分 100
用户昵称 Gravatarraywzy 是否通过 通过
代码语言 C++ 运行时间 0.236 s
提交时间 2013-09-12 21:29:44 内存使用 0.47 MiB
显示代码纯文本
#include<fstream>
using namespace std;
ifstream fin("djsc.in");
ofstream fout("djsc.out");
int f[200][200];
int n,m,p;
int ans[101],a[101];
bool b[101]={0};
int maxn=0,temp=99999999;
int maxl=99999999;
int flag=0;
int linshi;
void dfs(int x,int c)
{
	if(x==p+1)
	{
		for(int k=0;k<n;k++)
		{
			linshi=temp;
			for(int j=1;j<=p;j++)
			{
				if(f[k][a[j]]==0)
				{
					flag=1;
					
					break;
				}
				if(f[k][a[j]]!=0)
				{
					if(f[k][a[j]]<temp)
						temp=f[k][a[j]];
				}
			}
			if(flag==0)
			{
			if(temp>maxn)
				maxn=temp;}
			if(flag==1)
				temp=linshi;
			temp=99999999;
			flag=0;
		}
		if(maxn<maxl)
		{
			maxl=maxn;
			for(int h=1;h<=p;h++)
			{
				ans[h]=a[h];
			}
		}
	}
	else
	{
		for(int i=c;i<n;i++)
		{
			if(b[i]==0)
			{
				b[i]=1;
				a[x]=i;
				dfs(x+1,c+1);
				b[i]=0;
				temp=99999999;
				maxn=0;
			}
		}
	}
}
int main()
{
	fin>>n>>m>>p;
	int i,j,k,A,B,C;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			f[i][j]=99999999;
	for(i=1;i<=m;i++)
	{
		fin>>A>>B>>C;
		f[A][B]=C;
		f[B][A]=C;
	}
	for(k=0;k<n;k++)//依旧floyd求最短路
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
			{
				if(f[i][j]>f[i][k]+f[k][j])
					f[i][j]=f[i][k]+f[k][j];
			}
	for(i=0;i<n;i++)
	{
		f[i][i]=0;
	}
	dfs(1,0);
	for(i=1;i<=p;i++)
		fout<<ans[i]<<' ';
	fout<<endl;
	return 0;
}