比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAA
题目名称 P服务点设置 最终得分 100
用户昵称 Hzoi_chairman 运行时间 0.035 s
代码语言 C++ 内存使用 0.89 MiB
提交时间 2016-10-07 16:40:26
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define maxe 20000
#define maxn 300 
using namespace std;
int read()
{
	int x,f=1;
	char ch;
	while(ch=getchar(),!isdigit(ch))if(ch=='-')f=-1;
	x=ch-48;
	while(ch=getchar(),isdigit(ch))x=x*10+ch-48;
	return x*f;
}
struct edge
{
	int t,n,d;
}a[maxe];
int len,head[maxn],n,m,p,dis[maxn][maxn],te,an=0x7f7f7f7f,ans[maxn],d[maxn],temp[maxn];
void insert(int x,int y,int z)
{
	a[++len].t=y;a[len].d=z;a[len].n=head[x];head[x]=len;
}
struct node
{
	int num,dis;
	node(int a,int b)
	{
		num=a;dis=b;
	}
	bool operator <(const node & a)const 
	{
		return dis>a.dis;
	}
};
#define k a[i].t
void dijs(int x)
{
	priority_queue<node> q;
	dis[x][x]=0;
	q.push(node(x,0));
	while(!q.empty())
	{
		node te=q.top();
		q.pop();
		int xx=te.num;
		if(dis[x][xx]!=te.dis)continue;
		for(int i=head[xx];i;i=a[i].n)
		{
			if(dis[x][k]>dis[x][xx]+a[i].d)
			{
				dis[x][k]=dis[x][xx]+a[i].d;
				q.push(node(k,dis[x][k]));
			}
		}
	}
}
#undef k
void work(int x,int z)
{
	if(z==0)
	{
		for(int i=0;i<n;i++)
			if(d[i]==0x7f7f7f7f)return ;
			else te=max(d[i],te);
		if(te<an)
		{
			an=te;
			memcpy(ans,temp,sizeof(temp));
		}
		return ;
	}
	int diss[maxn];
	for(int i=x+1;i<n;i++)
	{
		temp[++temp[0]]=i;
		memcpy(diss,d,sizeof(diss));
		int t=te;
		for(int j=0;j<n;j++)
			d[j]=min(d[j],dis[i][j]);
		work(i,z-1);
		te=t;
		memcpy(d,diss,sizeof(diss));
		temp[temp[0]--]=0;
	}
}
int main()
{
	freopen("djsc.in","r",stdin);
	freopen("djsc.out","w",stdout);
	n=read(),m=read(),p=read();
	memset(dis,0x7f,sizeof(dis));
	for(int i=1;i<=m;i++)
	{
		int x=read(),y=read(),z=read();
		insert(x,y,z);
		insert(y,x,z);
	}
	for(int i=0;i<n;i++)
		dijs(i);
	for(int i=0;i<n;i++)
	{
		memset(d,0x7f,sizeof(d));
		temp[++temp[0]]=i;
		for(int j=0;j<n;j++)
			d[j]=min(d[j],dis[i][j]);
		work(i,p-1);
		temp[temp[0]--]=0;
	}
	for(int i=1;i<=ans[0];i++)printf("%d ",ans[i]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}