比赛 |
防止浮躁的小练习V0.1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
P服务点设置 |
最终得分 |
100 |
用户昵称 |
森林 |
运行时间 |
0.182 s |
代码语言 |
C++ |
内存使用 |
0.36 MiB |
提交时间 |
2016-10-07 16:40:54 |
显示代码纯文本
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<stdlib.h>
#include<iomanip>
#include<string.h>
#include<math.h>
#define WJ(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
#define JW fclose(stdin);fclose(stdout);
using namespace std;
const int maxn=110;
int n,m,p,dis[maxn][maxn],order[maxn]={0},tot=0x3f3f3f3f,ans[maxn]={0},mmax=0,a=0;
bool flag[maxn]={0};
inline void QR(int& x){
char ch;int f=1;
while(ch=getchar(),ch<'0'||ch>'9')if(ch=='-')f=-1;
x=ch-48;
while(ch=getchar(),'0'<=ch&&ch<='9')x=x*10+ch-48;
x*=f;
}
inline void QW(int num){
if(num<0)putchar('-'),num=-num;
int cnt=0;char str[30];
while(str[++cnt]=num%10+48,num/=10);
while(putchar(str[cnt]),--cnt);
}
void find(int c){
if(c==p+1){
mmax=0;
for(int k=0;k<n;k++){
a=0x7fffffff;
for(int i=1;i<=p;i++)a=min(a,dis[order[i]][k]);
mmax=max(mmax,a);
}
if(mmax<tot){
tot=mmax;
for(int i=1;i<=p;i++)ans[i]=order[i];
}
return;
}
for(int i=0;i<n;i++){
if(!flag[i])flag[i]=1,order[c]=i,find(c+1),flag[i]=0;
}
}
int main(){
WJ(djsc);
QR(n),QR(m),QR(p);
int x,y,z;
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=m;i++){
QR(x),QR(y),QR(z);
dis[x][y]=dis[y][x]=min(z,dis[x][y]);
}
for(int k=0;k<n;k++)dis[k][k]=0;
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
find(1);
sort(ans+1,ans+1+p);
for(int i=1;i<=p;i++)QW(ans[i]),putchar(' ');
JW;
return 0;
}