比赛 |
防止浮躁的小练习V0.1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
P服务点设置 |
最终得分 |
100 |
用户昵称 |
浮生随想 |
运行时间 |
0.038 s |
代码语言 |
C++ |
内存使用 |
0.61 MiB |
提交时间 |
2016-10-07 16:45:44 |
显示代码纯文本
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=105,maxe=maxn*maxn*2;
struct eage{
int to,dis,next;
}b[maxe];
struct node{
int num,dis;
node(){;}
node(int a,int b){
num=a;dis=b;
}
bool operator<(const node&a)const{
return a.dis<dis;
}
};
int n,m,p,len=0,head[maxn],d[maxn][maxn],dis[maxn],ans=0x7f7f7f7f,a[maxn],road[maxn];
bool f[maxn];
void insert(int x,int y,int z){
len++;b[len].to=y;b[len].next=head[x];b[len].dis=z;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.num];i!=-1;i=b[i].next){
int j=b[i].to;
if(dis[j]>k.dis+b[i].dis){
dis[j]=k.dis+b[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]]);
for(int i=0;i<n;i++)maxx=max(maxx,dis[i]);
if(ans>maxx){
ans=maxx;
for(int i=0;i<p;i++)road[i]=a[i];
}
}
void dfs(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;
dfs(x+1);
f[i]=0;
}
}
int main(){
freopen("djsc.in","r",stdin);
freopen("djsc.out","w",stdout);
memset(d,0x7f,sizeof d);
memset(head,-1,sizeof head);
scanf("%d%d%d",&n,&m,&p);
for(int i=0;i<m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
insert(x,y,z);insert(y,x,z);
}
for(int i=0;i<n;i++)dijs(i);
dfs(0);
sort(road,road+p);
for(int i=0;i<p;i++)cout<<road[i]<<" ";
}