比赛 平凡的题目 评测结果 TTTTT
题目名称 平凡的皮卡丘 最终得分 0
用户昵称 Fmuckss 运行时间 5.000 s
代码语言 C++ 内存使用 2.38 MiB
提交时间 2015-11-03 11:54:11
显示代码纯文本
  1. #include<stdio.h>
  2. #include<queue>
  3. #include<iostream>
  4. #include<vector>
  5. #include<algorithm>
  6. #define maxn 40050
  7. #define inf 1e+9
  8. using namespace std;
  9. typedef pair<int,int> pi;
  10. int n,m,ans=inf;
  11. int dis[maxn],dis2[maxn];
  12. bool use[maxn],vis[maxn];
  13. struct node{
  14. vector<int> ne;
  15. vector<int> v;
  16. vector<bool> cantuse;
  17. }ns[maxn];
  18. void beg(){
  19. for(int i=1;i<=maxn;i++){
  20. dis[i]=inf;
  21. use[i]=false;
  22. }
  23. }
  24. void read(){
  25. scanf("%d %d",&n,&m);
  26. for(int i=1;i<=m;i++){
  27. int x,y,xy,yx;
  28. scanf("%d %d %d %d",&x,&y,&xy,&yx);
  29. ns[x].ne.push_back(y);
  30. ns[x].v.push_back(xy);
  31. ns[x].cantuse.push_back(false);
  32. ns[y].ne.push_back(x);
  33. ns[y].v.push_back(yx);
  34. ns[y].cantuse.push_back(false);
  35. }
  36. }
  37. int dijkstra(int be,int en){
  38. beg();
  39. priority_queue< pi , vector< pi > , greater< pi > > q;
  40. dis[be]=0;
  41. q.push(make_pair(0,be));
  42. while(!q.empty()){
  43. int tmp=q.top().second,distmp=q.top().first;
  44. q.pop();
  45. if(tmp==en) return dis[en];
  46. use[tmp]=true;
  47. for(int i=0;i<ns[tmp].ne.size();i++){
  48. int j=ns[tmp].ne[i];
  49. if(ns[tmp].cantuse[i])continue;
  50. if(dis[j]>distmp+ns[tmp].v[i]){
  51. dis[j]=distmp+ns[tmp].v[i];
  52. if(!use[j])q.push(make_pair(dis[j],j));
  53. }
  54. }
  55. }
  56. return dis[en];
  57. }
  58. int dfs(int x){
  59. for(int i=0;i<ns[x].ne.size();i++){
  60. int tmp=ns[x].ne[i];
  61. if(vis[tmp])continue;
  62. ns[tmp].cantuse[i]=true;
  63. dis2[tmp]+=dis2[x]+ns[x].v[i];
  64. vis[tmp]=true;
  65. ans=min(ans,dis2[tmp]+dijkstra(tmp,1));
  66. dfs(tmp);
  67. vis[tmp]=false;
  68. dis2[tmp]-=dis2[x]+ns[x].v[i];
  69. ns[tmp].cantuse[i]=false;
  70. }
  71. return ans==inf ? -1:ans;
  72. }
  73. int solve(){
  74. for(int i=1;i<=n;i++){
  75. for(int j=0;j<ns[i].ne.size();j++){
  76. // printf("%d->%d: dij:%d w:%d\n",i,ns[i].ne[j],dijkstra(i,ns[i].ne[j]),ns[i].v[j]);
  77. ans=min(ans,dijkstra(ns[i].ne[j],i)+ns[i].v[j]);
  78. }
  79. }
  80.  
  81. }
  82. int main(){
  83. freopen("both.in","r",stdin);
  84. freopen("both.out","w",stdout);
  85. read();
  86. vis[1]=true;
  87. printf("%d",dfs(1));
  88. return 0;
  89. }