vj 网址 点击打开链接
这道题说实话有点坑, 我们队伍今天打比赛 的时候不知道怎么了 全程懵逼 真心不知道在干点什么事情 哎~~ 真心是 水的一匹 然后这道题 没想到会是这样做的 想到是 最短路了 但是 我们队伍交流有问题吧 就是可能两个人都是急性子 然后 就凉凉了 在想一道搜索题 但是那道搜索题 暴力就能过 但是我们随便出几组样例 就t 了 但是 人家暴力就是ac 了 ~~ 没办法 当时很头疼 就是没有ac 后来发现这道题就是水 就是让你找一条路 路还是最短路 只不过要更新到j的值是 最大一节点的值 所以就是 ans【j】=max(ss【ss】【j】,v)然后 直接更新就行 啊~~~ 真心简单
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<string>
#include<math.h>
using namespace std;
const int kk=550;
const int inf=0x3f3f3f3f;
int ans[kk];
int ss[kk][kk];
bool bj[kk];
int nn,mm;
void slove(int gg)
{
int v,jj;
memset(bj,0,sizeof(bj));
for(int i=0; i<nn; i++)
ans[i]=ss[gg][i];
ans[gg]=0;
for(int i=0; i<nn; i++)
{
v=inf,jj=-1;
for(int j=0; j<nn; j++)
{
if(!bj[j]&&v>ans[j])
v=ans[j],jj=j;
}
if(jj==-1)
break;
bj[jj]=1;
for(int j=0; j<nn; j++)
{
if(!bj[j]&&ans[j]>max(ss[jj][j],v))
ans[j]=max(ss[jj][j],v);
}
}
}
int main()
{
int t,kai,w,v,s,qw=0;
scanf("%d",&t);
while(t--)
{
qw++;
memset(ss,inf,sizeof(ss));
memset(ans,inf,sizeof(ans));
scanf("%d%d",&nn,&mm);
for(int i=0; i<mm; i++)
{
scanf("%d%d%d",&w,&v,&s);
ss[w][v]=min(ss[w][v],s);
ss[v][w]=min(ss[v][w],s);
}
scanf("%d",&kai);
slove(kai);
printf("Case %d:\n",qw);
for(int i=0;i<nn;i++)
{
if(ans[i]==inf)
printf("Impossible\n");
else
printf("%d\n",ans[i]);
}
}
return 0;
}