栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3613 Wormhole Transport

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3613 Wormhole Transport

#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<map>#include<set>#include<vector>using namespace std;typedef long long lld;#define pb push_back#define mp make_pair#define X first#define Y secondstruct Edge{int v,next,s;}edge[1000010];int head[210];int pos;void insert(int x,int y,int s){edge[pos].v=y;edge[pos].s=s;edge[pos].next=head[x];head[x]=pos++;}int n;int p[210];int q[210];bool vis[210][1<<4];pair<int,int> queue[1000010];int rear,front;int maxQ=1000010;void spfa(int dis[][1<<4],int flag[],int &T,int s[]){T=0;for(int i=1;i<=n;i++)dis[i][0]=0;memset(vis,false,sizeof(vis));rear=front=0;for(int i=1;i<=n;i++){if(flag[i] == 0)continue;dis[i][1<<T]=0;queue[front++]=mp(i,1<<T);vis[i][1<<T]=true;s[T]=flag[i];T++;}while(rear != front){int now=queue[rear].X;int mask1=queue[rear].Y;rear++;if(rear == maxQ)rear=0;vis[now][mask1]=false;for(int i=head[now];i;i=edge[i].next){int v=edge[i].v;for(int mask2=0;mask2<(1<<T);mask2++){if(dis[v][mask2] == -1)continue;int next=mask1|mask2;int add=dis[now][mask1]+edge[i].s+dis[v][mask2];if(dis[v][next] == -1 || add < dis[v][next]){dis[v][next]=add;if(!vis[v][next]){vis[v][next]=true;queue[front++]=mp(v,next);if(front == maxQ)front=0;}}}}}}int s1[4];int s2[4];int dp1[210][1<<4];int dp2[210][1<<4];int cost[1<<4][1<<4];int val[1<<4][1<<4];pair<int,int> dp[1<<4][1<<4];pair<int,int> judge(pair<int,int> a,pair<int,int> b){if(a.X > b.X)return a;if(a.X < b.X)return b;if(a.Y < b.Y)return a;return b;}int main(){while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++)scanf("%d %d",&p[i],&q[i]);memset(head,0,sizeof(head));pos=1;int m;scanf("%d",&m);while(m--){int x,y,s;scanf("%d %d %d",&x,&y,&s);insert(x,y,s);insert(y,x,s);}memset(dp1,-1,sizeof(dp1));memset(dp2,-1,sizeof(dp2));int T1,T2;spfa(dp1,p,T1,s1);spfa(dp2,q,T2,s2);memset(cost,-1,sizeof(cost));for(int m1=0;m1<(1<<T1);m1++)for(int m2=0;m2<(1<<T2);m2++){int t1=0;int t2=0;for(int i=0;i<T1;i++)if(m1&(1<<i))t1+=s1[i];for(int i=0;i<T2;i++)if(m2&(1<<i))t2+=s2[i];val[m1][m2]=min(t1,t2);for(int i=1;i<=n;i++){if(dp1[i][m1] == -1 || dp2[i][m2] == -1)continue;int add=dp1[i][m1]+dp2[i][m2];if(cost[m1][m2] == -1 || add < cost[m1][m2])cost[m1][m2]=add;}}for(int m1=0;m1<(1<<T1);m1++)for(int m2=0;m2<(1<<T2);m2++)dp[m1][m2]=mp(0,0);for(int m1=0;m1<(1<<T1);m1++)for(int m2=0;m2<(1<<T2);m2++){if(cost[m1][m2] == -1)continue;for(int i=(1<<T1)-1;i>=0;i--)for(int j=(1<<T2)-1;j>=0;j--){if((m1&i) || (m2&j))continue;int f1=m1|i;int f2=m2|j;dp[f1][f2]=judge(dp[f1][f2],mp(dp[i][j].X+val[m1][m2],dp[i][j].Y+cost[m1][m2]));}}pair<int,int> ans=mp(0,0);for(int m1=0;m1<(1<<T1);m1++)for(int m2=0;m2<(1<<T2);m2++)ans=judge(ans,dp[m1][m2]);printf("%d %dn",ans.X,ans.Y);}return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/378195.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号