原题链接:新三国争霸
解题思路:
注意事项:
参考代码:
暴力枚举(其实就是普通算法的总称)
有超时的迹象,毕竟!
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int oo=0x3f3f3f3f;
struct edge
{
int f,t,w;
bool operator < (const edge & ee) const
{
return w<ee.w;
}
}
g[5010];
int fa[310],m,n,dp[310],k,t,v,q,xx[30010],yy[30010],t1[30010],t2[30010],ban[310][310],clo;
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int kru(int L,int R)
{
int i,j,cnt=0,ret=0,u,v;
clo++;
for (i=1;i<=q;i++)
if ((t1[i]>=L&&t1[i]<=R)||(t2[i]>=L&&t2[i]<=R)||(L>=t1[i]&&L<=t2[i])||(R>=t1[i]&&R<=t2[i])) ban[xx[i]][yy[i]]=ban[yy[i]][xx[i]]=clo; for (i=1;i<=n;i++) fa[i]=i; for (i=1;i<=m;i++) { if (ban[g[i].f][g[i].t]==clo) continue; u=find(g[i].f); v=find(g[i].t); if (u!=v) { fa[u]=v; cnt++; ret+=g[i].w; if (cnt==n-1) break; } } if (cnt==n-1) return ret; else return oo;}
int main()
{
int i,j,p,x,y,z;
scanf("%d%d%d%d%d",&n,&m,&t,&v,&k);
for (i=1;i<=m;i++)
scanf("%d%d%d",&g[i].f,&g[i].t,&g[i].w);
scanf("%d",&q);
for (i=1;i<=q;i++)
scanf("%d%d%d%d",&xx[i],&yy[i],&t1[i],&t2[i]);
sort(g+1,g+m+1);
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for (i=1;i<=t;i++)
for (j=0;j<i;j++)
dp[i]=min(dp[i],dp[j]+k+kru(j+1,i)*(i-j)*v);
printf("%d\n",dp[t]);
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复