zoukankan      html  css  js  c++  java
  • hdu3599 War(最大流)

    转载请注明出处: http://www.cnblogs.com/fraud/           ——by fraud

    War

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 1534    Accepted Submission(s): 334


    Problem Description
    In the war between Anihc and Bandzi, Anihc has won Bangzi. At that time, Lvbin, the king of Anihc, want to start from Bangzi to beat Nebir across the channel between them. He let his army get to there as soon as possible, and there located many islands which can be used to have a break. In order to save time, the king forbid the army getting through the same pass for more than one time, but they can reach the same island for as many as times they want.
    Yunfeng, the General of the army, must tell how many optimal ship routes are there to the king as soon as possible, or he will be killed. Now he asks for your help. You must help Yunfeng to save his life.
    He tells you that there are N island. The islands are numbered from 1 to N(1 is Bangzi and N is Nebir, others are many islands). And there are many ways, each way contain the islands number U and V and the length W. Please output your answer.
     


    Input
    The first line in the input file contains a single integer number T means the case number. 
    Each case contains a number N (N<=1500) means the number of the islands. 
    And then many lines follow. Each line contains three numbers: U V W (W<10000), means that the distance between island U and V is W. The input of ways are terminated by “ 0 0 0 ”.
     


    Output
    Print the number of the optimal ship routes are there after each case in a line.
     


    Sample Input
    1 6 1 2 1 3 2 1 3 4 1 1 3 2 4 2 2 4 5 1 5 6 1 4 6 2 0 0 0
     


    Sample Output
    2
     


    Author
    alpc92
     


    Source

    题意:

    问有几种最短路的方案。每条边只能经过一次。

    分析:

    跑一遍最短路,若某条边是最短路的中的边,则连一条对应的容量为1的边,然后dinic搞一下就行

      1 //#####################
      2 //Author:fraud
      3 //Blog: http://www.cnblogs.com/fraud/
      4 //#####################
      5 #include <iostream>
      6 #include <sstream>
      7 #include <ios>
      8 #include <iomanip>
      9 #include <functional>
     10 #include <algorithm>
     11 #include <vector>
     12 #include <string>
     13 #include <list>
     14 #include <queue>
     15 #include <deque>
     16 #include <stack>
     17 #include <set>
     18 #include <map>
     19 #include <cstdio>
     20 #include <cstdlib>
     21 #include <cmath>
     22 #include <cstring>
     23 #include <climits>
     24 #include <cctype>
     25 using namespace std;
     26 #define XINF INT_MAX
     27 #define INF 0x3FFFFFFF
     28 #define MP(X,Y) make_pair(X,Y)
     29 #define PB(X) push_back(X)
     30 #define REP(X,N) for(int X=0;X<N;X++)
     31 #define REP2(X,L,R) for(int X=L;X<=R;X++)
     32 #define DEP(X,R,L) for(int X=R;X>=L;X--)
     33 #define CLR(A,X) memset(A,X,sizeof(A))
     34 #define IT iterator
     35 typedef long long ll;
     36 typedef pair<int,int> PII;
     37 typedef vector<PII> VII;
     38 typedef vector<int> VI;
     39 #define MAXN 1600
     40 vector<PII> Map[MAXN];
     41 
     42 
     43 void init() { REP(i,MAXN) Map[i].clear(); }
     44 
     45 int dis[MAXN];
     46 void dijkstra(int s)
     47 {
     48     REP(i,MAXN){dis[i]=i==s?0:INF;}
     49     int vis[MAXN] = {0};
     50     priority_queue<PII, vector<PII>, greater<PII> > q;
     51     q.push(MP(0,s));
     52     while(!q.empty())
     53     {
     54         PII p = q.top(); q.pop();
     55         int x = p.second;
     56         if(vis[x])continue;
     57         vis[x] = 1;
     58         for(vector<PII>::iterator it = Map[x].begin(); it != Map[x].end(); it++)
     59         {
     60             int y = it->first;
     61             int d = it->second;
     62             if(!vis[y] && dis[y] > dis[x] + d)
     63             {
     64                 dis[y] = dis[x] + d;
     65                 q.push(MP(dis[y],y));
     66             }
     67         }
     68     }
     69 }
     70 struct edge{
     71     int to,cap,rev;
     72     edge(int _to,int _cap,int _rev)
     73     {
     74         to=_to;
     75         cap=_cap;
     76         rev=_rev;
     77     }
     78 };
     79 const int MAX_V=2020;
     80 vector<edge>G[MAX_V];
     81 int iter[MAX_V];
     82 int level[MAX_V];
     83 int tot=0;
     84 void add_edge(int from,int to,int cap)
     85 {
     86     G[from].PB(edge(to,cap,G[to].size()));
     87     G[to].PB(edge(from,0,G[from].size()-1));
     88 }
     89 void bfs(int s,int t)
     90 {
     91     CLR(level,-1);
     92     queue<int>q;
     93     level[s]=0;
     94     q.push(s);
     95     while(!q.empty())
     96     {
     97         int u=q.front();
     98         q.pop();
     99         for(int i=0;i<G[u].size();i++)
    100         {
    101             edge &e=G[u][i];
    102             if(e.cap>0&&level[e.to]<0)
    103             {
    104                 level[e.to]=level[u]+1;
    105                 q.push(e.to);
    106             }
    107         }
    108     }
    109 }
    110 int dfs(int v,int t,int f)
    111 {
    112     if(v==t)return f;
    113     for(int &i=iter[v];i<G[v].size();i++)
    114     {
    115         edge &e=G[v][i];
    116         if(e.cap>0&&level[v]<level[e.to])
    117         {
    118             int d=dfs(e.to,t,min(f,e.cap));
    119             if(d>0)
    120             {
    121                 e.cap-=d;;
    122                 G[e.to][e.rev].cap+=d;
    123                 return d;
    124             }
    125         }
    126     }
    127     return 0;
    128 }
    129 int Dinic(int s,int t)
    130 {
    131     int flow=0;
    132     for(;;)
    133     {
    134         bfs(s,t);
    135         if(level[t]<0)return flow;
    136         memset(iter,0,sizeof(iter));
    137         int f;
    138         while((f=dfs(s,t,INF))>0)
    139         {
    140             flow+=f;
    141         }
    142     }
    143 }
    144 
    145 int main()
    146 {
    147     ios::sync_with_stdio(false);
    148     int t;
    149     scanf("%d",&t);
    150     while(t--){
    151         int n;
    152         init();
    153         scanf("%d",&n);
    154         int u,v,d;
    155         while(scanf("%d%d%d",&u,&v,&d)&&(u||v||d)){
    156             u--;
    157             v--;
    158             Map[u].PB(MP(v,d));
    159             Map[v].PB(MP(u,d));
    160         }
    161         if(n==1){
    162             printf("0
    ");
    163             continue;
    164         }
    165         for(int i=0;i<n;i++)G[i].clear();
    166         dijkstra(0);
    167         for(int i=0;i<n;i++){
    168             for(vector<PII>::iterator it = Map[i].begin(); it != Map[i].end(); it++)
    169             {
    170                 int y = it->first;
    171                 int d = it->second;
    172                 if(dis[i]+d==dis[y]){
    173                     add_edge(i,y,1);
    174                 }
    175             }
    176         }
    177         printf("%d
    ",Dinic(0,n-1));
    178     }
    179         
    180             
    181     return 0;
    182 }
    代码君
  • 相关阅读:
    一二类斯特林数小结
    我的博客搬家了!
    常用编程思想与算法
    【spring专题】spring简介
    九、 Java程序初始化的顺序(二)
    八、 Java程序初始化的顺序(一)
    python的上下文管理
    七、 面向对象(二)
    六、 面向对象基础
    paramiko模块及ssh远程登陆
  • 原文地址:https://www.cnblogs.com/fraud/p/4354735.html
Copyright © 2011-2022 走看看