hdu 4738 Caocao's Bridges(2013杭州网络赛丶神坑)

 

hdu 4738 Caocao's Bridges(2013杭州网络赛丶神坑)

分类: 图论   84人阅读  评论(2)  收藏  举报

就是求最小权值的桥。。不过有好几个坑。。。

1:原图不连通,ans=0.

2: m<=n^2 显然有重边,重边必然不是桥,处理重边直接add(u, v, INF).

3:   最小桥边权为0的时候,ans=1,至少要派一个人运炸弹。。。

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include<algorithm>  
  3. #include<vector>  
  4. #include<string>  
  5. #include<queue>  
  6. #include<stack>  
  7. #include<cstdio>  
  8. #include<cstring>  
  9. #include<cstdlib>  
  10. #include<cmath>  
  11. #include<fstream>  
  12. #include<sstream>  
  13. #include<map>  
  14. #include<set>  
  15. using namespace std;  
  16.   
  17. const int N = 1111;  
  18. const int INF = 100000000;  
  19. int n, m;  
  20. int pre[N], low[N], dfs_clock;  
  21. int bccno[N], vis[N], wi[N][N], g[N][N];  
  22. struct Edge  
  23. {  
  24.     //flag = 1 ->bridge  
  25.     int from, to, w, flag;  
  26. };  
  27. vector<int> G[N];  
  28. vector<Edge> edges;  
  29.   
  30. //add bidir edge  
  31. void addedge(int u, int v, int w)  
  32. {  
  33.     edges.push_back((Edge){u, v, w, 0});  
  34.     edges.push_back((Edge){v, u, w, 0});  
  35.     int nima = edges.size();  
  36.     G[u].push_back(nima-2);  
  37.     G[v].push_back(nima-1);  
  38. }  
  39.   
  40. int dfs(int u, int fa)  
  41. {  
  42.     int lowu = pre[u] = ++dfs_clock;  
  43.     int sz = G[u].size();  
  44.     for(int i=0; i<sz; i++)  
  45.     {  
  46.         int v = edges[G[u][i]].to;  
  47.         if(!pre[v])  
  48.         {  
  49.             int lowv = dfs(v, u);  
  50.             lowu = min(lowu, lowv);  
  51.             if(lowv > pre[u]) edges[G[u][i]].flag = 1, edges[G[u][i]^1].flag = 1;  
  52.         }  
  53.         else if(pre[v] < pre[u] && v != fa) lowu = min(lowu, pre[v]);  
  54.     }  
  55.     return low[u] = lowu;  
  56. }  
  57.   
  58. void dfs1(int u)  
  59. {  
  60.     vis[u] = 1;  
  61.     int sz = G[u].size();  
  62.     for(int i=0; i<sz; i++)  
  63.     {  
  64.         Edge e = edges[G[u][i]];  
  65.         int v = e.to;  
  66.         if(!vis[v]) dfs1(v);  
  67.     }  
  68. }  
  69. int u, v, w;  
  70.   
  71. int main()  
  72. {  
  73.     while(scanf("%d%d", &n, &m), n+m)  
  74.     {  
  75.         for(int i=0; i<n+1; i++) G[i].clear();  
  76.         edges.clear();  
  77.         memset(g, 0, sizeof(g));  
  78.         for(int i=0; i<m; i++)  
  79.         {  
  80.             scanf("%d%d%d", &u, &v, &w); u--; v--;  
  81.             g[u][v]++; //BIANSHU  
  82.             g[v][u]++;  
  83.             wi[u][v] = w;  
  84.         }  
  85.   
  86.         //CHONG BIAN  
  87.         for(int i=0; i<n; i++)  
  88.             for(int j=0; j<n; j++)  
  89.             {  
  90.                 if(g[i][j] == 1) addedge(i, j, wi[i][j]);  
  91.                 else if(g[i][j] > 1) addedge(i, j, INF);  
  92.             }  
  93.   
  94.         //BU LIANTONG  
  95.         memset(vis, 0, sizeof(vis));  
  96.         dfs1(0);  
  97.         bool flag = 0;  
  98.         for(int i=0; i<n; i++)  
  99.         {  
  100.             if(!vis[i])  
  101.             {  
  102.                 flag = 1;  
  103.                 break;  
  104.             }  
  105.         }  
  106.         if(flag)  
  107.         {  
  108.             puts("0");  
  109.             continue;  
  110.         }  
  111.         //QIAO  
  112.         memset(pre, 0, sizeof(pre));  
  113.         dfs_clock  = 0;  
  114.         for(int i=0; i<n; i++) if(!pre[i]) dfs(i, -1);  
  115.         int ans = INF;  
  116.         int sz = edges.size();  
  117.         for(int i=0; i<sz; i++) if(edges[i].flag == 1) ans = min(ans, edges[i].w);  
  118.         if(ans == INF) puts("-1");  
  119.         else printf("%d\n", ans == 0 ? 1 : ans); //0 -> 1  
  120.     }  
  121.     return 0;  
  122. }  

你可能感兴趣的:(图论)