比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAA
题目名称 P服务点设置 最终得分 100
用户昵称 _Itachi 运行时间 0.120 s
代码语言 C++ 内存使用 0.50 MiB
提交时间 2016-10-07 16:33:52
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=105,INF=0x7f7f7f7f;
void _min(int &x,int y){if(x>y)x=y;}
void _max(int &x,int y){if(x<y)x=y;}
struct _tree{int to,next,dis;}e[maxn*maxn*2];
int head[maxn],n,m,p,len=0,ans=INF,vis[maxn],dis[maxn],tim=0;
bool hav[maxn],besu[maxn];
void _set(int prt,int son,int dis){
	e[++len].to=son,e[len].next=head[prt],head[prt]=len,e[len].dis=dis;
}
struct _q{int x,fee;
_q(int a=0,int b=0){x=a,fee=b;}
bool operator < (const _q &a)const{return fee>a.fee;}
};priority_queue<_q>q;
int _bfs(){
	while(!q.empty())q.pop();int i,res=0;_q rt;tim++;
	memset(dis,0x3f,sizeof(dis));
	for(i=0;i<n;i++)if(hav[i])dis[i]=0,q.push(_q(i,0));
	while(!q.empty()){
		rt=q.top(),q.pop();
		if(vis[rt.x]==tim)continue;vis[rt.x]=tim;
		if(dis[rt.x]>=ans)return INF;
		_max(res,dis[rt.x]);
		for(i=head[rt.x];i;i=e[i].next)
			if(vis[e[i].to]^tim&&dis[e[i].to]>dis[rt.x]+e[i].dis)
				dis[e[i].to]=dis[rt.x]+e[i].dis,
				q.push(_q(e[i].to,dis[e[i].to]));
	}
	return res;
}
void _dfs(int rt,int v){
	if(v==p){
		int tot=_bfs();
		if(tot<ans){
			ans=tot;
			for(int i=0;i<n;i++)besu[i]=hav[i];
		}
		return;
	}
	for(int i=rt+1;i<n;i++)
		hav[i]=true,_dfs(i,v+1),hav[i]=false;
}
int main(){
	freopen("djsc.in","r",stdin);freopen("djsc.out","w",stdout);
	scanf("%d%d%d",&n,&m,&p);int x,y,z;
	while(m--)scanf("%d%d%d",&x,&y,&z),_set(x,y,z),_set(y,x,z);
	for(int i=0;i<n;i++)hav[i]=true,_dfs(i,1),hav[i]=false;
	for(int i=0;i<n;i++)if(besu[i])printf("%d ",i);
	fclose(stdin);fclose(stdout);
}