现在的位置: 首页 > 综合 > 正文

HDU 4360 – As long as Binbin loves Sangsang

2013年01月26日 ⁄ 综合 ⁄ 共 1802字 ⁄ 字号 评论关闭

 

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4360

 

2012 年多校 第7场, 1001 。

 

方法: 优先队列 + SPFA 

 

基础题。。。。   Trick 是,最终结果会爆int (有的数据需要重复兜圈)。。。

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>

using namespace std;

const __int64 inf = (__int64)0x7ffffff * 0x7ffffff;

int pp[100];

struct Point{
	int x,p,num;
	__int64 cost;
	bool friend operator<(Point a,Point b){
		return a.cost!=b.cost?a.cost>b.cost:a.num<b.num;
	}
}res; 

priority_queue<Point>que;

struct Edge{
	int t,nxt,len,p;
}eg[30000];
int et[2000],tol;

void add_edge(int u,int v,int l,char p){
	eg[tol].t=v;
	eg[tol].nxt=et[u];
	eg[tol].len=l;
	eg[tol].p=pp[p];
	et[u]=tol++;
}

__int64 dis[2000][4];
int num[2000][4];

void init_(int n){
	for(int i=1;i<=n;i++){
		et[i]=-1;
		for(int j=0;j<4;j++)
			dis[i][j]=inf,num[i][j]=0;
	}
	tol=0;
	while(!que.empty()) que.pop();
}

int spfa(int x,int n){
	Point no,nx;
	int i;
	no.x=x,no.p=-1,no.num=0,no.cost=0;
	que.push(no);
	while(!que.empty()){
		no=que.top();
		que.pop();
		if(no.x==n && no.p==3){
			res=no;
			return 1;
		}
		for(i=et[no.x];i!=-1;i=eg[i].nxt){
			nx.p=no.p+1;	
			if(nx.p==4) nx.p=0;
			if(eg[i].p!=nx.p) continue;
			nx.x=eg[i].t;
			nx.cost=no.cost+eg[i].len;
			nx.num=no.num;
			if(nx.p==3) nx.num++; 
			if(dis[nx.x][nx.p]<nx.cost || dis[nx.x][nx.p]==nx.cost && num[nx.x][nx.p]>=nx.num) continue;
			dis[nx.x][nx.p]=nx.cost;
			num[nx.x][nx.p]=nx.num;
			que.push(nx);
		}
		
	}
	return 0;
}

int main(){
	int n,m,t,tt=1;
	int u,v,len;
	char op[2];
	pp['L']=0,pp['O']=1,pp['V']=2,pp['E']=3;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		init_(n);
		while(m--){
			scanf("%d%d%d%s",&u,&v,&len,op);
			add_edge(u,v,len,op[0]);
			if(u!=v) add_edge(v,u,len,op[0]);
		}
		printf("Case %d: ",tt++);
		if(spfa(1,n)) printf("Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %d LOVE strings at last.",res.cost,res.num);
		else printf("Binbin you disappoint Sangsang again, damn it!");
		puts("");
	}
	return 0;
}
/*
2
9 12
1 3 2 L
3 5 2 O
5 7 2 V
7 9 2 E
1 2 1 L
2 3 1 O
3 4 1 V
4 5 1 E
5 6 1 L
6 7 1 O
7 8 1 V
8 9 1 E
1 4
1 1 1 L
1 1 1 O
1 1 1 V
1 1 1 E

*/

 

抱歉!评论已关闭.