BZOJ 2324 營救皮卡丘

2022-05-09 01:45:09 字數 1634 閱讀 5497

思路:最小費用最大流

考慮設陣列d[k][i][j],代表只用前k個城市,i到j的最短路

然後可以這樣建圖

s->0 流量為k,費用為0

i->i+n 流量為inf,費用為0

i+n->t 流量為1

i+n->j 流量為inf,費用為d[j][i][j]

s->i  流量為1,費用為0 代表如果乙個人到了i城市,它可以繼續走,從而續出來的乙個新流量。

1 #include2 #include3 #include4 #include5 #include6

#define inf 0x7fffffff

7int d[205][205][205],a[205][205

],k;

8int tot,go[200005],next[200005],first[200005],cost[200005],flow[200005];9

int op[200005],dis[200005],c[200005],vis[200005],edge[200005],from[200005

];10

ints,t,n,m,ans;

11int

read()

14while ('0'

<=ch&&ch<='9')

15return t*f;16}

17void insert(int x,int y,int z,int

l)25

void add(int x,int y,int z,int

l)29

bool

spfa()45}

46 vis[now]=0;47

}48return dis[t]!=0x3f3f3f3f;49

}50void

updata()

55for (int i=t;i!=s;i=from

[i])60}

61int

main()else

68 a[i][j]=0;69

for (int i=1;i<=m;i++)

74for (int k=0;k<=n;k++)

82 s=2*n+2;t=s+1

;83 add(s,0,k,0

);84

for (int i=0;i<=n;i++)

85 add(i,i+n+1,inf,0

);86

for (int i=0;i<=n;i++)

87 add(i,t,1,0

);88

for (int i=0;i<=n;i++)

89 add(s,i+n+1,1,0

);90

for (int i=0;i<=n;i++)

91for (int j=i+1;j<=n;j++)

92if (d[j][i][j]<0x3f3f3f3f

)93 add(i+n+1

,j,inf,d[j][i][j]);

94while

(spfa()) updata();

95 printf("

%d\n

",ans);

96 }

BZOJ2324 營救皮卡丘,費用流

傳送門 寫在前面 內心充滿波動 思路 題目有幾個關鍵點 1.每乙個點都必須有人經過 2.經過j點時,0 j 1必須都經過了才可以 由此可以構造出乙個網路流的模型。由於每個節點的第一次訪問,必定是由小於它的節點完成的,所以先用floyd預處理dis k i j 表示i到j只經過小於等於k的點的最短路。...

2324 ZJOI2011 營救皮卡丘

題目鏈結 題目大意 n 1個城市 0到n 初始時k個人都在0城市。城市之間有距離。要求 1 遍歷完n個城市 有乙個人遍歷了某個城市就算這個城市被遍歷了 2 遍歷i城市前必須遍歷完前i 1個城 市,並且在遍歷前i 1個城市時不能經過大於等於i的城市。在滿足 1 2 的前提下使得k個人走的總距離最小 題...

ZJOI2011 營救皮卡丘

題面 神仙題。做最小路徑覆蓋。有乙個很像的地方,就是最小路徑覆蓋必須覆蓋到每個點,這道題也一樣。這道題有4個和最小路徑覆蓋不一樣的地方 可以重複訪問 這個可以用 floyed 傳遞閉包解決 每條路徑必須從原點出發 每個點必須被 到達 並不能乙個節點成乙個路徑 假設已經訪問了 1.x 那麼至少有乙個人...