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