比赛 防止浮躁的小练习V0.1 评测结果 AEEEEEEEEE
题目名称 上学路线 最终得分 10
用户昵称 NVIDIA 运行时间 0.663 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2016-10-07 18:50:23
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int INF=999999999;
  4. const int MAXN=10;
  5. typedef vector<int> VEC;
  6. typedef int Array[MAXN];
  7. int N,M,S,T; Array dist1,dist2,flag;
  8. VEC Map[MAXN],Val[MAXN],Cost[MAXN],Num[MAXN];
  9.  
  10. queue<int>Q;
  11. void SPFA(int start,int end,Array& dist)
  12. {
  13. S=start,T=end;
  14. for(int i=1;i<=N;i++) dist[i]=INF,flag[i]=0;
  15. dist[S]=0; Q.push(S); flag[S]=1;
  16. int u,v,nxt;
  17. while(!Q.empty())
  18. {
  19. u=Q.front(); Q.pop(); flag[u]=0;
  20. for(unsigned int i=0;i<Map[u].size();i++)
  21. {
  22. v=Map[u][i],nxt=dist[u]+Val[u][i];
  23. if(nxt>=dist[v]) continue;
  24. dist[v]=nxt; if(flag[v]) continue;
  25. Q.push(v); flag[v]=1;
  26. }
  27. }
  28. }
  29.  
  30. inline void AddEdge(int u,int v,int t,int c,int n)
  31. {
  32. Map[u].push_back(v); Val[u].push_back(t); Cost[u].push_back(c); Num[u].push_back(n);
  33. }
  34.  
  35. void init()
  36. {
  37. scanf("%d %d\n",&N,&M);
  38. for(int u,v,t,c,i=1;i<=M;i++)
  39. {
  40. scanf("%d %d %d %d\n",&u,&v,&t,&c);
  41. AddEdge(u,v,t,c,i); AddEdge(v,u,t,c,i);
  42. }
  43. }
  44.  
  45. int Ans=0,P=1;
  46. class NODE
  47. {
  48. public:
  49. int node,c,next,num;
  50. }Node[MAXN];
  51. int start[MAXN];
  52. int level[MAXN],now[MAXN];
  53. void AddEdgee(int a,int b,int c,int n)
  54. {
  55. P++;
  56. Node[P].node=b,Node[P].next=start[a],start[a]=P,Node[P].c=c,Node[P].num=n;
  57. P++;
  58. Node[P].node=a,Node[P].next=start[b],start[b]=P,Node[P].c=0,Node[P].num=n;
  59. }
  60.  
  61. bool BFS()
  62. {
  63. memset(level,0,sizeof(level));
  64. memcpy(now,start,T+1<<2);
  65. level[T]=1;
  66. while(!Q.empty()) Q.pop();
  67. Q.push(T);
  68. int u;
  69. while(!Q.empty())
  70. {
  71. u=Q.front(); Q.pop();
  72. for(int i=start[u],v=Node[i].node;i;i=Node[i].next,v=Node[i].node)
  73. {
  74. if(Node[i^1].c && !level[v] )
  75. {
  76. Q.push(v);
  77. level[v]=level[u]+1;
  78. if(v==S) return 1;
  79. }
  80. }
  81. }
  82. return 0;
  83. }
  84.  
  85. inline int Min(int a,int b) {return a<b?a:b;}
  86. int Dinic(int u,int l)
  87. {
  88. if(u==T) return l;
  89. int t=l,tmp;
  90. for (int i=now[u],v=Node[i].node;i;now[u]=i=Node[i].next,v=Node[i].node)
  91. {
  92. if(Node[i].c&&level[v]==level[u]-1)
  93. {
  94. tmp=Dinic(v,Min(l,Node[i].c));
  95. Node[i].c-=tmp;Node[i^1].c+=tmp;
  96. l-=tmp;
  97. if (l==0) break;
  98. }
  99. }
  100. if (l==t) level[u]=-1;
  101. return t-l;
  102. }
  103.  
  104. void solve()
  105. {
  106. SPFA(1,N,dist1); SPFA(N,1,dist2);
  107. printf("%d\n",dist1[N]);
  108. int v,t,n;
  109. for(int i=1;i<=N;i++)
  110. {
  111. for(unsigned int k=0;k<Map[i].size();k++)
  112. {
  113. v=Map[i][k],t=Val[i][k],n=Num[i][k];
  114. if(dist1[i]+t+dist2[v]!=dist1[N]) continue;
  115. AddEdgee(i,v,Cost[i][k],n);
  116. }
  117. } S=1,T=N;
  118. while(BFS()) Ans+=Dinic(S,INF);
  119. BFS();
  120. VEC Cut;
  121. for(int k=1;k<=N;k++)
  122. {
  123. for(int i=start[k],v=Node[i].node;i;i=Node[i].next,v=Node[i].node)
  124. {
  125. if(level[k]<=0 || level[v]<=0) continue;
  126. Cut.push_back(Node[i].num);
  127. }
  128. }
  129. printf("%d %d\n",Cut.size(),Ans);
  130. for(unsigned int i=0;i<Cut.size();i++) printf("%d\n",Cut[i]);
  131. }
  132.  
  133. int main()
  134. {
  135. freopen("routez.in","r",stdin);
  136. freopen("routez.out","w",stdout);
  137. init();
  138. solve();
  139. return 0;
  140. }