HDU 2647 Reward 拓扑排序
生活随笔
收集整理的這篇文章主要介紹了
HDU 2647 Reward 拓扑排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://acm.hdu.edu.cn/showproblem.php?pid=2647
題意:
輸入N和M代表N個人和M組數據,M組數據中的A和B代表A的工資要比B的工資高,底薪是(888元),問你這個老板至少要付
多少錢給這些員工,A比B工資高就是說A的工資“至少”比B高1元,當拓撲排序出現環的時候輸出 -1 ,否則輸出老板要給的錢數。
?
坑爹:
用拓撲排序找到入度為0的所有的點都有著同樣的工資。
???? 例如:1-2? 3-4? 這樣1和3都為889元,2和4為888元,所以老板所付的總工資為3554元。?
?
解法:
在每次調用cut函數的時候都要訪問與他相鄰的邊的點的入度,每訪問一次IN[ map[ k ][ i ] ] --;我們可以在每次判斷一下當前的點(k)
的工資+1與map[ k ][ i ] 的工資的比較大小,取大的一個放入map[ k?][?i ]?的工資里,因為某個人可能在某條線路上工資排名可能是第二,
但在另一條線路上工資排名可能就是排第三了,根據題意,所以這個人的工資為890而不是889。
例如:
這樣的話1和2為888,3為889,4為890,5為891。
?
View Code 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 const int maxn = 10000 + 10; 6 int IN[maxn]; 7 int used[maxn]; 8 int valve[maxn]; 9 vector <int> map[maxn]; 10 int N; 11 12 int find_zero() 13 { 14 int i; 15 for(i=1; i<=N; i++) 16 { 17 if(!used[i] && IN[i]==0) 18 { 19 return i; 20 } 21 } 22 return -1; 23 } 24 25 void cut(int k) 26 { 27 int i; 28 for(i=0; i<map[k].size(); i++) 29 { 30 IN[map[k][i]]--; 31 if(valve[map[k][i]]<valve[k]+1) 32 { 33 valve[map[k][i]]=valve[k]+1; 34 } 35 } 36 map[k].clear(); 37 } 38 39 int topology() 40 { 41 int i; 42 int k=0; 43 int flag=0; 44 int sum=0; 45 for(i=1; i<=N; i++) 46 { 47 k=find_zero(); 48 if(k==-1) 49 { 50 return -1; 51 } 52 else 53 { 54 cut(k); 55 used[k]=1; 56 sum+=valve[k]; 57 } 58 } 59 return sum; 60 } 61 62 int main() 63 { 64 int M; 65 while(cin>>N>>M) 66 { 67 memset(used,0,sizeof(used)); 68 memset(IN,0,sizeof(IN)); 69 int i; 70 for(i=0; i<=N; i++) 71 { 72 valve[i]=888; 73 } 74 75 for(i=1; i<=M; i++) 76 { 77 int a; 78 int b; 79 cin>>a>>b; 80 map[b].push_back(a); 81 IN[a]++; 82 } 83 84 int sum=topology(); 85 if(sum!=-1) 86 { 87 cout<<sum<<endl; 88 } 89 else 90 { 91 cout<<-1<<endl; 92 } 93 for(i=1; i<=N; i++) 94 { 95 map[i].clear(); 96 } 97 } 98 return 0; 99 }?
轉載于:https://www.cnblogs.com/pcpcpc/archive/2012/09/10/2678461.html
總結
以上是生活随笔為你收集整理的HDU 2647 Reward 拓扑排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NEXUS S安卓4.0/4.1 【完美
- 下一篇: APK反编译工具