解题思路:
暴力搜索加最优化剪枝
注意事项:不想填(滑稽)

参考代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int mid[10];
int n,m,q;
int E[10],F[10];
int x,y,z,d;
int lin[105],cnt;
struct str
{
    int next,y,z,d;
}e[10005];
void insertt()
{
    e[++cnt].y=y;
    e[cnt].next=lin[x];
    lin[x]=cnt;
    e[cnt].z=z;
    e[cnt].d=d;
}
int vis[105];
int ans,temp;
void work(int x)
{
    if(x==n-1)
    {
        ans=ans>temp?temp:ans;
        return ;
    }
    if(temp>=ans)return ;
    for(int i=lin[x];i;i=e[i].next)
    {
        if(!vis[e[i].y])
        {
            vis[e[i].y]=1;
            temp+=e[i].d;
            int tt=++mid[e[i].z];
            if(tt==2)temp+=E[e[i].z];
            else if(tt>2)temp+=F[e[i].z];
            work(e[i].y);
            if(tt==2)temp-=E[e[i].z];
            else if(tt>2)temp-=F[e[i].z];
            --mid[e[i].z];
            vis[e[i].y]=0;
            temp-=e[i].d;
        }
    }
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        cnt=0;
        memset(e,0,sizeof(e));
        memset(lin,0,sizeof(lin));
        memset(mid,0,sizeof(mid));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<m;i++)
            scanf("%d",&E[i]);
        for(int i=0;i<m;i++)
            scanf("%d",&F[i]);
        for(int i=0;i<q;i++)
        {
            scanf("%d%d%d%d",&x,&y,&z,&d);
            insertt();
        }
        ans=2000000000;
        temp=0;
        work(0);
        printf("%d\n",ans);
    }
    return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

o南笙吖o 2年前 回复TA
作者一般用万能头,偶尔会不用......