PTA——L2-4 网红点打卡攻略 (25 分)

alt alt 本质上就是一个链式前向星建图加一个简单地查找(注意这里是双向图),没什么太大的难点,但是样例中的第四条路线过不了(但是我感觉是可行的),所以代码无法处理第四条路线这样的数据。

using namespace std;
int n,m;//点个数和路径条数
int x,y,z;//点1,点2,费用
int cnt,k,cost;//k行攻略
int mp[600];
long long ans;
struct point{
    int t,next,co;
}edge[2000];
int head[500];

void addedge(int x,int y,int z){
    edge[++cnt].t=y;
    edge[cnt].co=z;
    edge[cnt].next=head[x];
    head[x]=cnt;
}
struct anss{//输出答案的
    int a,b;
};
deque<int> route;
queue<anss> fina;
void searh(int x){
    int flag=-1,nt;//nt是下一个点
    //  cout<<x;
    for(int i=head[x]; i!=-1; i=edge[i].next){
        //cout<<route.front();
        if(edge[i].t==route.front()){
            flag=1;
            nt=route.front();
            route.pop_front();
            cost+=edge[i].co;
            //cout<<9;
            break;
        }
        //cout<<edge[i].t;
    }
    
    if(flag==-1){
        for(int i=head[route.front()]; i!=-1; i=edge[i].next){
            if(edge[i].t==x){
                flag=-1;
                nt=route.front();
                route.pop_front();
                cost+=edge[i].co;
                break;
            }
        }
    }
    
    if(flag==1&&!route.empty())
    searh(nt);
    else
        return;
}
int main(){
    cin>>n>>m;
    memset(head,-1,sizeof(head));
    for(int i=1; i<=m; i++){
        cin>>x>>y>>z;
        addedge(x,y,z);
        addedge(y,x,z);
    }
    cin>>k;
    int flag;
    int cont=0,cntt=0,l;
    for(int i=1; i<=k; i++){
        memset(mp,0,sizeof(mp));
        flag=1;
        while(!route.empty())
            route.pop_front();
        ans=1e9;
        cost=0;
        cin>>cont;
       
        while(cont--){
            cin>>l;
            if(mp[l]==1)
                flag=-1;
            mp[l]=1;
            route.push_back(l);
        } 
        route.push_back(0);
        if(flag==1)
        searh(0);
        if(route.empty()){
           cntt++;
            if(cost<ans){
                ans=cost;
                anss dd;
                dd.a=i;
                dd.b=cost;
                fina.push(dd);
            }
        }
    }
    
    cout<<cntt<<endl;
    int po=1e9,a;
    while(!fina.empty()){
        if(fina.front().b<po){
            po=fina.front().b;
            a=fina.front().a;
        }
            fina.pop();
     }
    cout<<a<<" "<<po;
    return 0;
}

全部评论

相关推荐

08-27 12:02
已编辑
南京外国语学校 网络安全
再来一遍:实则劝各位不要all in华子,不要相信华为hr
点赞 评论 收藏
分享
10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务