洛谷 P4843 清理雪道 有上下界最小流

2021-08-28 07:26:45 字數 1883 閱讀 9080

題目描述

滑雪場坐落在fj省西北部的若干座山上。

從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡(即雪道),弧的方向代表斜坡下降的方向。

你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行,並清理他所經過的雪道。

由於每次飛行的耗費是固定的,為了最小化耗費,你想知道如何用最少的飛行次數才能完成清理雪道的任務。

輸入輸出格式

輸入格式:

輸入檔案的第一行包含乙個整數n (2 <= n <= 100) – 代表滑雪場的地點的數量。

接下來的n行,描述1~n號地點出發的斜坡,第i行的第乙個數為mi (0 <= mi < n) ,後面共有mi個整數,由空格隔開,每個整數aij互不相同,代表從地點i下降到地點aij的斜坡。每個地點至少有乙個斜坡與之相連。

輸出格式:

輸出檔案的第一行是乙個整數k – 直公升飛機的最少飛行次數。

輸入輸出樣例

輸入樣例#1:

81 3

1 72 4 5

1 81 8

02 6 5

0輸出樣例#1:

4分析:

題意是尋找乙個dag的最小邊覆蓋。

我們首先考慮把邊看做點,跑最小點覆蓋。因為邊很多(可能有n

2n^2

n2條),點可以重複走,即使網路流不t,跑傳遞閉包也會t。複雜度為o(m

3)

o(m^3)

o(m3)。

所以我們考慮直接對原圖跑網路流。

建立乙個s

ss向每個點連inf

infin

f流量的邊(表示可以從任意一點開始),每個點向t

tt連inf

infin

f流量的邊(表示可以從任意一點結束)。原圖的每條邊要至少走一遍,也就是流量為[1,

inf)

[1,inf)

[1,inf

)。**:

#include #include #include #include #include const int maxn=207;

const int maxe=maxn*maxn*5;

const int inf=0x3f3f3f3f;

using namespace std;

int n,tot,x,cnt,s,t,sum,ans;

int ls[maxn],deg[maxn],dis[maxn];

struct edgeg[maxe];

queue q;

void add(int x,int y,int w)

; ls[x]=cnt;

g[++cnt]=(edge);

ls[y]=cnt;

}bool bfs()}}

return (dis[t]!=inf);

}int dfs(int x,int maxf)

}return ret;

}int dinic()

int main()

}

int s=n+1,t=n+2,ss=n+3,tt=n+4;

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

int nowcnt=cnt;

add(t,s,inf);

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

s=ss,t=tt;

dinic();

ans=g[nowcnt+2].w;

for (int i=nowcnt+1;i<=cnt;i++) g[i].w=0;

s=t,t=s;

ans-=dinic();

printf("%d",ans);

}

洛谷P4843 清理雪道 有上下界最小流

時空限制 1000ms 128mb 題目描述 滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部...

洛谷P4843 清理雪道

滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行...

洛谷4843 BZOJ2502 清理雪道

有源匯有上下界的最小可行流。yy一下建圖應該很好搞吧 就是對於每個雪道都是 1,inf 然後源點到所有點都是 0,inf 所有點到匯點都是 0,inf 這樣的話跑乙個有源匯上下界最小可行流就可以了 有關於這個可以看liu runda神犇的介紹 非常直觀易懂 最開始先建超級源匯 跑可行流得到乙個基礎流...