SPOJ - CATTACK - 最短路或者dp

26 篇文章 0 订阅

题目链接:https://vjudge.net/problem/SPOJ-CATTACK

 

解题思路;

根据思路建图跑最短路,或者dp更简单.

 

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int mx = 2e5+10;
struct node{
	int y,w;
	int nxt;
}e[mx<<1];
int head[mx], tot;
int a[mx],b[mx];
int dis[mx];
bool vis[mx];
void init(){
	memset(head, -1, sizeof(head));
	tot = 0;
}
void add(int u, int v, int w)
{
	e[tot] = {v,w,head[u]};
	head[u] = tot++;
}
void spfa(int S)
{
	memset(dis,inf,sizeof(dis));
	queue <int> que;
	que.push(S);
	dis[S] = 0;
	while(!que.empty())
	{
		int no = que.front();
		que.pop();
		vis[no] = 0;
		for(int i=head[no];~i;i=e[i].nxt)
		{
			int u = e[i].y;
			if(dis[u]>dis[no]+e[i].w)
			{
				dis[u] = dis[no] + e[i].w;
				if(!vis[u]){
					vis[u] = 1;
					que.push(u);
				}
			}
		}
	}
}
int main(){
	int t;
	scanf("%d", &t);
	while(t--){
		init();
		int n, l0, l1, s0, s1;
		scanf("%d %d %d %d %d", &n, &l0, &l1, &s0, &s1);
		int cnt = 2*n + 2;
		add(1,2,l0),add(1,3,l1);
		for(int i=1;i<n;i++) scanf("%d",a+i);
		for(int i=1;i<n;i++) scanf("%d",b+i);
		for(int i=2,j=1;i<cnt-3;i+=2,j++)
		add(i,i+3,a[j]),add(i,i+2,b[j]);
		
		for(int i=1;i<n;i++) scanf("%d",a+i);
		for(int i=1;i<n;i++) scanf("%d",b+i);
		for(int i=3,j=1;i<cnt-2;i+=2,j++)
		add(i,i+1,a[j]),add(i,i+2,b[j]);
		
		add(2*n,cnt,s0),add(2*n+1,cnt,s1);
		spfa(1);
		printf("%d\n",dis[cnt]);
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值