求HAKE,WA。
查看原帖
求HAKE,WA。
490694
Compound_Interest楼主2022/12/24 19:57
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
const int maxn=1e4+10;
int head[maxn],cnt=1,id[maxn][300],dp[200][300],tot,ti[300],dis[maxn][maxn],ci[maxn],n,ct;
bool fir[maxn],vis[maxn];
struct p{
	int i,j;
	p(int i_,int j_){
		i=i_,j=j_; 
	}
	p(){}
}path[200][300];
struct edge{
	int to,nxt,w;
}e[maxn*maxn];
void add(int u,int v,int w){
	e[cnt].to=v,e[cnt].w=w,e[cnt].nxt=head[u],head[u]=cnt++;
}
struct node{
	int now,w;
	node(int now_,int w_){
		now=now_,w=w_;
	}
	node(){}
};
bool operator<(node x,node y){
	return x.w>y.w;
}
priority_queue<node>q;
void dij(int s){
	dis[s][s]=0,q.push(node(s,0));
	memset(vis,0,sizeof(vis));
	while(!q.empty()){
		node now=q.top();
		q.pop();
		int u=now.now;
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(dis[s][v]>dis[s][u]+e[i].w){
				dis[s][v]=dis[s][u]+e[i].w;
				q.push(node(v,dis[s][v]));
			}
		}
	}
}
void print(int i,int j){
	if(i==0) return;
	print(path[i][j].i,path[i][j].j);
	if(j!=path[i][j].j){
		printf("%d ",j);
	}
}
map<int,int>mp;
int insert(int x){
	if(mp.find(x)==mp.end()) mp[x]=++ct;
	return mp[x];
}
int main(){
	int T,cas=0;
	while(~scanf("%d",&T)){
		++cas;
		if(T==0) break;
		int op=T;
		memset(fir,0,sizeof(fir)),memset(id,0,sizeof(id)),memset(head,0,sizeof(head));
		cnt=1,tot=0,ct=0;
		for(int i=1;i<=T;i++){
			scanf("%d",&ti[i]);
			int t,pre=-1;scanf("%d",&t);
			for(int j=1;j<=t;j++){
				int k;scanf("%d",&k);
				k=insert(k);
				id[k][i]=++tot;
				if(j==1) fir[tot]=1;
				else add(id[pre][i],tot,0);
				pre=k;
			}
		}
		for(int i=1;i<=tot;i++)
			for(int j=1;j<=T;j++){
				if(fir[id[i][j]]) continue;
				for(int k=1;k<=T;k++)
					if(fir[id[i][k]]) add(id[i][j],id[i][k],ti[k]);
			}
		memset(dis,0x3f,sizeof(dis));
		for(int i=1;i<=tot;i++) dij(i);
		scanf("%d",&T);
		for(int t=1;t<=T;t++){
			scanf("%d",&n);
			for(int i=1;i<=n;i++) scanf("%d",&ci[i]),ci[i]=insert(ci[i]);
			memset(dp,0x3f,sizeof(dp));
			for(int i=1;i<=op;i++)
				if(fir[id[ci[1]][i]]) dp[1][i]=ti[i];
			for(int i=2;i<=n;i++)
				for(int j=1;j<=op;j++)
					for(int k=1;k<=op;k++)
						if(dp[i-1][k]+dis[id[ci[i-1]][k]][id[ci[i]][j]]<dp[i][j]){
							dp[i][j]=dp[i-1][k]+dis[id[ci[i-1]][k]][id[ci[i]][j]];
							path[i][j]=p(i-1,k);
						}
			int ans=0x3f3f3f3f,an;
			for(int i=1;i<=op;i++) 
				if(ans>dp[n][i]) an=i,ans=min(ans,dp[n][i]);
			printf("Case %d, Trip %d: Cost = %d\n",cas,t,ans);
			printf("  Tickets used: ");
			print(n,an);
			printf("\n");
		}
	}
	return 0;
}
2022/12/24 19:57
加载中...