J: Our Journey of Dalian Ends
urumqi-2017-online
存一個學姐用的模板(:з」∠)
因為每個點只能經過一次,拆點,限制為1
以上海為起點
大連和西安兩個點再連向終點,限制為1
判斷最終流量是否為2就能判斷是否從大連開始到西安結束了
#include<bits/stdc++.h>
using namespace std;
#define N 30005
#define M 60005
#define INF 10000000
#define ms(x,y) memset(x,y,sizeof(x))
const double EPS=1e-9;
struct Edge{
int u,v,cap,next;
double cost;
}edge[M<<1];
int sumFlow,edgeNum,head[N],pp[N];
double dist[N];
bool inq[N];
void add(int u,int v,int cap,double cost){
edge[edgeNum].u=u;edge[edgeNum].v=v;edge[edgeNum].cap=cap;edge[edgeNum].cost=cost;
edge[edgeNum].next=head[u];head[u]=edgeNum++;
edge[edgeNum].u=v;edge[edgeNum].v=u;edge[edgeNum].cap=0 ;edge[edgeNum].cost=-cost;
edge[edgeNum].next=head[v];head[v]=edgeNum++;
}
bool SPFA(int s,int t,int n){
int i,u,v;
queue<int>q;
ms(inq,0),ms(pp,-1);
for(i=0;i<=n;i++) dist[i]=INF;
inq[s]=1;dist[s]=0;
q.push(s);
while(!q.empty()){
u=q.front();q.pop();inq[u]=0 ;
for(i=head[u];i!=-1;i=edge[i].next){
v=edge[i].v;
if(edge[i].cap&&dist[v]>dist[u]+edge[i].cost+EPS){
dist[v]=dist[u]+edge[i].cost;
pp[v]=i;
if(!inq[v]){
q.push(v);
inq[v]=1;
}
}
}
}
if(pp[t]==-1) return false;
return true;
}
pair<int,double> MCMF(int s,int t,int n){
int flow=0,i,minflow;
double mincost=0;
while(SPFA(s,t,n)){
minflow=INF;
for(i=pp[t];i!=-1;i=pp[edge[i].u])
minflow=min(edge[i].cap,minflow);
flow+=minflow;
for(i=pp[t];i!=-1;i=pp[edge[i].u])
edge[i].cap-=minflow,edge[i^1].cap+=minflow;
mincost+=dist[t]*minflow;
}
return make_pair(flow,mincost);
}
map<string,int>MP;
int main()
{
int t,n,m,i,u[N],v[N],w[N];
scanf("%d",&t);
while(t--){
edgeNum=0,ms(head,-1);
MP.clear();
MP["Shanghai"]=1;
MP["Dalian"]=2;
MP["Xian"]=n=3;
scanf("%d",&m);
string s;
for(i=1;i<=m;i++){
cin>>s;
if(MP.find(s)==MP.end()) MP[s]=++n;
u[i]=MP[s];
cin>>s;
if(MP.find(s)==MP.end()) MP[s]=++n;
v[i]=MP[s];
scanf("%d",&w[i]);
}
for(i=1;i<=m;i++)
if(u[i]==1) add(u[i],v[i],1,w[i]);
else if (v[i]==1) add(v[i],u[i],1,w[i]);
else add(u[i]+n-1,v[i],1,w[i]),add(v[i]+n-1,u[i],1,w[i]);
// add(0,1,2,0);
for(i=2;i<=n;i++) add(i,i+n-1,1,0);
add(2+n-1,2*n,1,0);
add(3+n-1,2*n,1,0);
pair<int,double> p=MCMF(1,2*n,2*n);
if(p.first==2) printf("%.0f\n",p.second);
else puts("-1");
}
}
相關推薦
J: Our Journey of Dalian Ends
urumqi-2017-online 存一個學姐用的模板(:з」∠) 因為每個點只能經過一次,拆點,限制為1 以上海為起點 大連和西安兩個點再連向終點,限制為1 判斷最終流量是否為2就能判斷是否從大連開始到西安結束了 #include<bi
ACM ICPC 烏魯木齊網路賽 J. Our Journey of Dalian Ends
Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpected places and unexpected people. Now o
2017 ACM-ICPC 亞洲區(烏魯木齊賽區)網路賽 J.Our Journey of Dalian Ends【最小費用最大流】
Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpected places and unexpected people. Now our journey of Dal
2017烏魯木齊網絡賽 J題 Our Journey of Dalian Ends ( 最小費用最大流 )
增廣路 ali += ase turn src eof weight flow 題目鏈接 題意 : 給出一副圖,大連是起點,終點是西安,要求你求出從起點到終點且經過中轉點上海的最小花費是多少? 分析 : 最短路是最小費用最大流的一個特例,所以有些包含中轉限制或者經過點
計蒜客-2017 ACM-ICPC 亞洲區(烏魯木齊賽區)網路賽J題Our Journey of Dalian Ends (最小費用最大流)
題意: 給定若干個城市,出發點為大連,目的地為西安,但是要求中途必須經過上海,並且圖中每個城市只能經過一次,給出m條路(雙向道路),走第i條路需要wi代價,求所有滿足要求的方案中花費的最小代價,如果沒有滿足的方案,輸出-1。 思路: 相當於求從大連到上海加上西安到上海花費的
Our Journey of Dalian Ends
給定雙向邊,求Dalian到Shanghai再到Xian,途中不經過統一的城市,求最短距離 費用流 源點往Shanghai連邊,城市進行拆點處理(流量為1,確保只經過一次),然後城市之間流量為1,費用為對應距離,最後Dalian和Xian與匯點連邊
Our Journey of Xian Ends
ron using one 圖片 map gin anti def cos Our Journey of Xian Ends 鏈接:here 參考http://blog.csdn.net/wangshuhe963/article/details/78516821 費
2017 icpc 青島站 K. Our Journey of Xian Ends 最小費用流
K. Our Journey of Xian Ends 題意:這英文題真是比六級閱讀還難讀,給你一個無向圖,求西安-->上海-->青島-->上海的最短路,每個城市有一個機場,但是上海有兩個機場 虹橋機場和浦東機場,上海這兩個機場可以互達(你可以從西安到浦東,然後再從虹橋到青
2017 icpc 青島站 K. Our Journey of Xian Ends 最小費用流
題意:這英文題真是比六級閱讀還難讀,給你一個無向圖,求西安-->上海-->青島-->上海的最短路,每個城市有一個機場,但是上海有兩個機場 虹橋機場和浦東機場,上海這兩個機場可以互達(你可以從西安到浦東,然後再從虹橋到青島,距離為0),每個機場只能下飛機和
2017 ACM 區域賽青島站(現場賽) K Our Journey of Xian Ends
Life is a journey, and the road we travel has twists and turns, which sometimes lead us to unexpected places and unexpected people. Now our journey of Xia
用keil編譯提示 warning: #...: last line of file ends without a newline
str 空格 LG ref title mil div 警告 OS 用keil編譯提示 warning: ......: last line of file ends without a newline 最後一行回車後還要保證是在第一列,新一行不能有空格等空字符才能不出
A journey of English learning two
This mini-story learning process made me feel like I was back to my original state, almost every time I could not get in
A journey of English learning one
The ten day is fleeting, and the acceptance of the third little stories is coming soon, though this is often topic,But f
Quickbooks Search Platform — Our Journey to AWS
Quickbooks Search Platform — Our Journey to AWS“The journey is what brings us happiness, not the destination”— Dan Millman, Way of the Peaceful WarriorIn a
Getting to Go: The Journey of Go's Garbage Collector
12 July 2018 This is the transcript from the keynote I gave at the International Symposium on Memory Managem
使用新手MDK時候,有關警告:last line of file ends without a newline解決辦法
Keil軟體編譯的時候,總會出現一個問題:warning: #1-D: lastline of file ends without a newline!如下圖所示: 百度下結局辦法就是 將游
j-3. .each(),for each ,for of ,for in-------待續
包裝 修改 -- 方式 () this指向 element sof UNC .each()是一個for循環的包裝叠代器.each()通過回調的方式處理,並且會有2個固定的實參,索引與元素(從0開始計數).each()回調方法中的this指向當前叠代的dom元素<but
2017CCPC 杭州 J. Master of GCD【差分標記/線段樹/GCD】
include bits puts 一個 ear size assert amp 就是 給你一個n個初始元素都為1的序列和m個詢問q。 詢問格式為:l r x(x為2or3) 最後求1~n所有數的GCD GCD:把每個數分別分解質因數,再把各數中的全部公有質因數提取出來連乘
牛客網暑期ACM多校訓練營(第六場)J Heritage of skywalkert
題意 lcm time \n main 一句話 bsp boa first 題目鏈接:https://www.nowcoder.com/acm/contest/144/J 時間限制:C/C++ 1秒,其他語言2秒空間限制:C/C++ 262144K,其他語言524288K6
NEERC17 J Journey from Petersburg to Moscow
top inline ORC src names get div lld 技術分享 CF上可以提交。 鏈接 依然是很妙的解法。 我們可以枚舉每一個出現過的邊權$L$,然後把所有邊的邊權減掉這個$L$,如果小於$L$就變為$0$,然後跑一遍最短路然後加上$k * L$