搜索
热搜: NOIP OIer 神牛
查看: 173|回复: 5

1508

[复制链接]

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2024-3-25 20:32:36 | 显示全部楼层 |阅读模式
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,ans,pass[305],from,lu[305],ge,dp[305],minn=1E18,s,ma[305][305],qian[305];
bool vis[305],t[305];
struct node{
    int di,bian;
}dis[10005];
void dfs(int now){
    vis[now]=true;
    for(int i=1;i<=n;i++){
            if(ma[now][i]==-1||vis[i]||t[i]==1)continue;
            if(dis[now].di==-2)dis[now].di=0;
        dfs(i);
        if(自己填1){
                        dis[now].di=dis[i].di+ma[now][i],dis[now].bian=dis[i].bian;
                        if(from)pass[now]=i;
                }
    }
}
void print(int now){
        if(now){
                print(pass[now]);
                lu[++ge]=now;
                if(ge!=1)qian[ge]=qian[ge-1]+ma[lu[ge-1]][lu[ge]];
        }
}
signed main(){
        memset(ma,-1,sizeof(ma));
    cin>>n>>s;
    for(int i=1;i<n;i++){
            dis[i].bian=i;
            int u,v,w;
        cin>>u>>v>>w;
        ma[u][v]=w;
        ma[v][u]=w;
    }
    dis[n].bian=n;
    dfs(1);
    自己填2
    dfs(from);
        print(from);
        for(int i=1;i<=ge;i++){
                for(int j=i;j<=ge;j++){
                        if(qian[j]-qian[i]>s)break;
                        自己填3
                        int maxx=-1;
                        for(int l=1;l<=ge;l++)
                                if(t[lu[l]]==1){
                                    for(int i=1;i<=n;i++)vis[i]=false,dis[i].di=0,dis[i].bian=i;
                                    dis[lu[i]].di=-2;
                                        dfs(lu[l]);
                                        maxx=max(maxx,dis[lu[l]].di);
                                }
                        minn=min(minn,maxx);
                }
                memset(t,false,sizeof(t));
        }
        cout<<minn;
}

回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2024-3-25 21:12:44 | 显示全部楼层
我试试啊,看看能不能过
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2024-3-25 21:40:55 | 显示全部楼层
纯属参考::


  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n,ans,pass[305],from,lu[305],ge,dp[305],minn=1E18,s,ma[305][305],qian[305];
  5. bool vis[305],t[305];
  6. struct node{
  7.     int di,bian;
  8. }dis[10005];
  9. void dfs(int now){
  10.     vis[now]=true;
  11.     for(int i=1;i<=n;i++){
  12.         if(ma[now][i]==-1||vis[i]||t[i]==1)continue;
  13.         if(dis[now].di==-2)dis[now].di=0;
  14.         dfs(i);
  15.         
  16.         // int y=e[i].to;
  17.         // if(vis[y]) continue;
  18.         // d[y]=d[x]+1;
  19.         // dfs(y);
  20.         // if(d[c]<d[y])
  21.         // {
  22.         //     d[c]=d[y];
  23.         //     c=y;
  24.         // }
  25.         
  26.         if(d[now]<d[i])  //自己填1    (应该没什么问题吧)
  27.         {
  28.             dis[now].di=dis[i].di+ma[now][i],dis[now].bian=dis[i].bian;
  29.             if(from) pass[now]=i;
  30.         }
  31.     }
  32. }
  33. void print(int now)
  34. {
  35.     if(now)
  36.     {
  37.         print(pass[now]);
  38.         lu[++ge]=now;
  39.         if(ge!=1)
  40.         {
  41.             qian[ge]=qian[ge-1]+ma[lu[ge-1]][lu[ge]];
  42.         }
  43.     }
  44. }
  45. signed main()
  46. {
  47.     memset(ma,-1,sizeof(ma));
  48.     cin>>n>>s;
  49.     for(int i=1;i<n;i++)
  50.     {
  51.         dis[i].bian=i;
  52.         int u,v,w;
  53.         cin>>u>>v>>w;
  54.         ma[u][v]=w;
  55.         ma[v][u]=w;
  56.     }
  57.     dis[n].bian=n;
  58.     dfs(1);
  59.     dis[1].bian=1;//自己填2   也有可能是 dis[0].bian=0;
  60.     dfs(from);
  61.     print(from);
  62.     for(int i=1;i<=ge;i++)
  63.     {
  64.         for(int j=i;j<=ge;j++)
  65.         {
  66.             if(qian[j]-qian[i]>s) break;
  67.             
  68.             //实在不知道怎么写了
  69.             
  70.             int maxx=-1;
  71.             for(int l=1;l<=ge;l++)
  72.             {
  73.                 if(t[lu[l]]==1)
  74.                 {
  75.                     for(int i=1;i<=n;i++)
  76.                     {
  77.                         vis[i]=false;
  78.                         dis[i].di=0;
  79.                         dis[i].bian=i;
  80.                     }
  81.                     dis[lu[i]].di=-2;
  82.                     dfs(lu[l]);
  83.                     maxx=max(maxx,dis[lu[l]].di);
  84.                 }
  85.                 minn=min(minn,maxx);
  86.             }
  87.             memset(t,false,sizeof(t));
  88.         }
  89.         
  90.     }
  91.     cout<<minn;
  92. }

复制代码
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2024-3-25 21:41:25 | 显示全部楼层
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2024-3-25 21:42:50 | 显示全部楼层
@编程狂热爱好者,你的(自己填3)好难想啊
真无语
回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2024-3-27 18:36:08 | 显示全部楼层
提示一下,1号是在求最长的路径,2号是初始化,3号是标记这个点是否在枚举范围之内
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

津ICP备19006949号-1 | 津公网安备12010102000465号

快速回复 返回顶部 返回列表