标签:clu input perfect least typedef logs c代码 empty ons
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 1389 Accepted Submission(s): 423
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<vector> 5 #include<fstream> 6 #include<queue> 7 using namespace std; 8 typedef long long LL; 9 const int MAXN=6e5+10; 10 const int N=3e5; 11 const LL MOD=998244353; 12 struct Edge{ 13 int to; 14 LL w; 15 }; 16 vector<Edge> edge[MAXN]; 17 int deg[MAXN]; 18 LL s[2]; 19 void dfs(int node,int pos, bool ext){ 20 //cout<<node<<‘ ‘<<s[0]<<‘ ‘<<s[1]<<‘ ‘<<deg[node]<<‘ ‘<<ext<<endl; 21 for(int i=0;i<edge[node].size();i++){ 22 int p=edge[node][i].to; 23 if(!deg[p]) 24 continue; 25 26 if(deg[p]==2) 27 { 28 deg[node]--; 29 deg[p]--; 30 s[pos]=s[pos]*edge[node][i].w%MOD; 31 dfs(p, pos^1, ext); 32 break; 33 } 34 else if(deg[node]==1&°[p]==1) 35 { 36 if(ext==false) 37 ext=true; 38 else{ 39 deg[node]--; 40 deg[p]--; 41 s[pos]=s[pos]*edge[node][i].w%MOD; 42 return; 43 } 44 } 45 } 46 } 47 48 int main() 49 { 50 //ifstream cin("ylq.txt"); 51 int T; 52 cin>>T; 53 int n,v1,v2; 54 LL w1,w2; 55 Edge e1,e2; 56 while(T--) 57 { 58 memset(deg, 0, sizeof(deg)); 59 //cin>>n; 60 scanf("%d", &n); 61 for(int i=1;i<=N+n;i++){ 62 edge[i].clear(); 63 } 64 for(int i=1;i<=n;i++){ 65 //cin>>v1>>w1>>v2>>w2; 66 scanf("%d %lld %d %lld", &v1, &w1, &v2, &w2); 67 deg[v1+N]++; 68 deg[v2+N]++; 69 deg[i]+=2; 70 71 e1.to=v1+N;e1.w=w1; 72 e2.to=v2+N;e2.w=w2; 73 edge[i].push_back(e1); 74 edge[i].push_back(e2); 75 76 e1.to=i;e2.to=i; 77 edge[v1+N].push_back(e1); 78 edge[v2+N].push_back(e2); 79 } 80 81 LL left=1; 82 queue<int> q; 83 for(int i=N;i<=n+N;i++) 84 if(deg[i]==1) 85 q.push(i); 86 87 int m; 88 while(!q.empty()) 89 { 90 int p, pp; 91 m=q.front(); q.pop(); 92 deg[m]=0; 93 for(int i=0;i<edge[m].size();i++){ 94 p=edge[m][i].to; 95 if(!deg[p]) 96 continue; 97 else 98 { 99 deg[p]=0; 100 left=left*edge[m][i].w%MOD; 101 for(int k=0;k<edge[p].size();k++){ 102 pp=edge[p][k].to; 103 if(deg[pp]==0) continue; 104 105 deg[pp]--; 106 if(deg[pp]==1) 107 q.push(pp); 108 } 109 } 110 } 111 112 } 113 //cout<<‘*‘<<left<<‘*‘<<endl; 114 LL ans=left; 115 for(int i=1;i<=n;i++){ 116 if(!deg[i]) 117 continue; 118 s[0]=s[1]=1; 119 dfs(i, 1, 0); 120 ans=ans*(s[0]+s[1])%MOD; 121 } 122 123 printf("%lld\n", ans); 124 } 125 }
我的代码里用入度出度判断是否走到重复点,看了好多人都是用vis判断的,感觉都差不多。。。。
HDU 6073 Matching In Multiplication —— 2017 Multi-University Training 4
标签:clu input perfect least typedef logs c代码 empty ons
原文地址:http://www.cnblogs.com/MasterSpark/p/7295808.html