比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAA
题目名称 P服务点设置 最终得分 100
用户昵称 Hzoi_Queuer 运行时间 0.041 s
代码语言 C++ 内存使用 0.60 MiB
提交时间 2016-10-07 17:07:47
显示代码纯文本
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=105,maxe=105*105*2;
struct Edge{
	int to,next,dis;
}e[maxe];
struct Node{
	int x,dis;
	Node(int a,int b){x=a;dis=b;}
	bool operator < (const Node &a)const{
		return a.dis<dis;
	}
};
int n,m,p,len=0,Ans=0x7fffffff;
int a[maxn],ans[maxn],dis[maxn],d[maxn][maxn],head[maxn];
bool f[maxn]={0};

void Insert(int x,int y,int z){
	len++;e[len].to=y;e[len].dis=z;e[len].next=head[x];head[x]=len;
}

void Dijs(int x){
	memset(dis,0x7f,sizeof dis);
	priority_queue<Node> q;
	q.push(Node(x,0));dis[x]=0;
	while(!q.empty()){
		Node k=q.top();q.pop();
		for(int i=head[k.x];i!=-1;i=e[i].next){
			int j=e[i].to;
			if(dis[j]>e[i].dis+k.dis){
				dis[j]=k.dis+e[i].dis;
				q.push(Node(j,dis[j]));
			}
		}
	}
	for(int i=0;i<n;i++)d[i][x]=d[x][i]=dis[i];
}

void Work(){
	memset(dis,0x7f,sizeof dis);
	int maxx=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<p;j++)
			dis[i]=min(dis[i],d[i][a[j]]);
		if(maxx<dis[i])maxx=dis[i];
	}
	if(Ans>maxx){
		Ans=maxx;
		for(int i=0;i<p;i++)ans[i]=a[i];
	}
}

void Find(int x){
	if(x==p){Work();return;}
	for(int i=0;i<n;i++){
		if(f[i])continue;
		if(a[x-1]>i)continue;
		a[x]=i;f[i]=1;
		Find(x+1);
		f[i]=0;
	}
}

int main()
{
	freopen("djsc.in","r",stdin);
	freopen("djsc.out","w",stdout);
	memset(head,-1,sizeof head);
	scanf("%d%d%d",&n,&m,&p);int x,y,z;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		Insert(x,y,z);Insert(y,x,z);
	}
	for(int i=0;i<n;i++)Dijs(i);
	Find(0);
	for(int i=0;i<p;i++)printf("%d ",ans[i]);
	fclose(stdin);fclose(stdout);
	return 0;
}