LightOJ - 1002 Country Roads

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

猜你喜欢

转载自blog.csdn.net/qq_41071646/article/details/80010543