比赛 |
防止浮躁的小练习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);
}