這題是在最短路上研究問題的,所以理所當然要建個圖先。
其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。
首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。
其實這兩題是不同的。。。所以我在考試時就掛了。。
因為這題比較特殊,不是一般的網路流(這個自己體會一下吧。。不好說。)
但是我們知道也有一些條件是一定要滿足的比如說
某些邊流滿的邊且左右兩邊屬於s和t集的原流量和一定是原最大流的值,即所有屬於割集的邊的流量和是否為原最大流,這是來預防兩條連續滿流的邊
另乙個條件是一條一定是割集的邊一條邊的兩個節點的費用一樣,那麼這也是有多解的
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int n=405;
const int m=4005;
char cher[10],chee[10];
ll x[m],y[m],e[m*2],er[m*2],n,m,z[m],val[n],nu,b[m*2],las[n],nex[m*2],dis[n],l,r,a[m*2],v[m*2],tot[n],re[m*2],t,ty[m][3],q[n][n];
bool bz[n];
void add(int x,int y,int z,int k)
bool pd()
return tot[n];
}int ditch(int x,ll y)}}
return we;
}int bed[n];
void dfs(int x,int z)
int main()
memset(dis,127,sizeof(dis));
memset(bz,0,sizeof(bz));
l=0;r=1;a[1]=1;bz[1]=1;dis[1]=0;
while (l
for(int p=las[a[++l]];p;p=nex[p])
}bz[a[l]]=0;
}memset(las,0,sizeof(las));val[n]=2000000007;
int cnt=0;nu=1;
for(int i=1;i<=m;i++)
ll ans=0;
while (pd()) ans+=ditch(1,4005000000000);
memset(bed,0,sizeof(bed));
dfs(1,0);
dfs(n,1);
ll sum=0,pew=0;
for(int i=1;i<=nu;i++)
if ((!(i&1))&&(bed[b[i]]==2&&bed[e[i]]==1)&&!v[i])
cher[0]='y',cher[1]='e',cher[2]='s';chee[0]='n';chee[1]='o';
if (sum!=ans)
if (pew) printf("%s %lld\n",chee,ans);else printf("%s %lld\n",cher,ans);
}}
模擬 NOIP 2013 花匠
花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...
NOIP2013模擬 粉刷匠
給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...
NOIP2013模擬 Rainbow的訊號
time limits 1000 ms memory limits 131072 kb special judge description freda發明了傳呼機之後,rainbow 進一步改了傳呼機傳送資訊所使用的號。由於現在是數字 資訊時代,rainbow 發明的訊號用 n個自然數表示。為了避免...