标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5438
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2237 Accepted Submission(s): 707
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <queue> 6 7 using namespace std; 8 #define ll long long 9 const int N=10010; 10 11 ll p,m,v[N],vis[N],indir[N]; 12 vector<ll>G[N]; 13 14 ll bfs(ll x) 15 { 16 queue<ll>q; 17 q.push(x); 18 vis[x]=1; 19 ll k=0; 20 ll sum=v[x]; 21 while (!q.empty()) 22 { 23 24 int s=q.front(); 25 q.pop(); //cout<<s<<endl; 26 k++; 27 for (int i=0; i<G[s].size(); i++) 28 { 29 if (!vis[G[s][i]]&&indir[G[s][i]]>=2)//删掉的点不可以加进来 30 { 31 sum+=v[G[s][i]]; 32 q.push(G[s][i]); 33 vis[G[s][i]]=1; 34 } 35 } 36 } 37 if (k>=3&&k%2==1) 38 return sum; 39 else 40 return 0; 41 } 42 43 int main() 44 { 45 int T,a,b; 46 scanf("%d",&T); 47 while (T--) 48 { 49 scanf("%lld%lld",&p,&m); 50 memset(vis,0,sizeof(vis)); 51 memset(G,0,sizeof(G)); 52 memset(indir,0,sizeof(indir)); 53 for (int i=1; i<=p; i++) 54 { 55 scanf("%lld",&v[i]); 56 } 57 for (int i=1; i<=p; i++) 58 G[i].clear(); 59 for (int i=1; i<=m; i++) 60 { 61 scanf("%d%d",&a,&b); 62 G[a].push_back(b);//将b放在a队列的最后一个 63 G[b].push_back(a); 64 indir[a]++; 65 indir[b]++; 66 } 67 int j; 68 for (int i=1; i<=p; i++) 69 { 70 for ( j=1; j<=p; j++) 71 { 72 if (indir[j]==0||indir[j]==1) 73 { 74 break; 75 } 76 } 77 if (j>p) 78 break; 79 indir[j]=-1; 80 for (int k=0; k<G[j].size(); k++) 81 { 82 indir[G[j][k]]--; 83 } 84 } 85 ll ans=0; 86 for (int i=1; i<=p; i++)//搜遍所有的环 87 if (!vis[i]&&indir[i]>=2) 88 ans+=bfs(i); 89 cout<<ans<<endl; 90 } 91 return 0; 92 }
标签:
原文地址:http://www.cnblogs.com/qq-star/p/4827100.html