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; }