題源:
題意: n行,每行給定字串s1,s2,s3代表一些菜譜名。s2和s3是煮成是的必要條件,然後給出c和v,分別代表s1的消耗和收穫;
(注意:這個消耗並不可能是s1的真正消耗和收穫,s1的最後消耗和收穫是得加上s2和s3的)
然後問在不用超過c消耗的情況下最大收穫是多少?
分析:這裡我們可以想象到,一道有條件的菜要做成是要若干個「前提」菜做成的,這個過程就是拓撲排序!我們對於每個s1,s2,s3編號後就是拓撲排序了,s2,s3,就是相當於給予s1乙個入度;
所有每次拓撲我們就列舉已經做成的s2和s3給最優的c和v給s1,然後最後對所有的菜進行01揹包找出答案
#includeusingview codenamespace
std;
typedef
long
long
ll;#define pb push_back
const
int inf=0x3f3f3f3f
;const ll inf=1e18;
const
int n=1e6+6
;const
int m=1e5+5
;struct
node;
vector
g[n];
ll dp[m],cc[m],vv[m],ind[m],book[n];
ll c[n],v[n];
intid,cnt;
char s1[50],s2[50],s3[50
];map
mp;mapsign;
queue
que;
int getid(string
x)
return
sign[x];
}int
main());
g[y].pb();
}for(int i=1;i<=id;i++)
while(!que.empty())
if(--ind[z]==0
) que.push(z);}}
}dp[
0]=0
;
for(int i=1;i<=id;i++)
ll maxx=0
; ll lasc=0
;
for(int i=1;i<=c;i++)
}printf(
"%lld\n%lld\n
",maxx,lasc);
return0;
}
Legal or Not hdu3342拓撲排序
題意 判斷圖中是否有環存在 思路 簡單的拓撲排序 將有關係的點,加乙個有向邊,然後記錄出入度,先找入度為0的點,將和他聯絡的點入度 1,再找入度為0的直到沒有點為止,判斷點是否全訪問過,如果是說明不存在環,如果不是就說明有環存在 include include include include inc...
HDU3342Legal or Not 拓撲排序
有向圖判斷是否成環 如果是環輸出no 只要入度為0的點的個數 等於 總的點的個數則無環 includeusing namespace std input by bxd define rep i,a,b for int i a i b i define ri n scanf d n define ri...
洛谷2017 暈牛Dizzy Cows(拓撲排序)
這道題為什麼想到拓撲排序?因為最後要求判斷無向邊方向使圖無環,所以就想到啦。對於已給出的有向邊,我們將u v視為u所以讀入所有有向邊後拓撲排序一下即可,詢問無向邊時如果u比v小,就u v,否則v u。includeusing namespace std const int maxn 1e5 10 c...