題目描述
滑雪場坐落在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神犇的介紹 非常直觀易懂 最開始先建超級源匯 跑可行流得到乙個基礎流...