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 }
    代码君
  • 相关阅读:
    Php ArrayIterator的几个常用方法
    13 子元素和后代元素选择器 1 元素之间的关系 2 后代元素选择器 后代 元素用的是空格 3 子元素选择器 用的是>号 4 ietest的使用
    12常用选择器 1元素选择器 2 id选择器3 class类选择器 4 一个元素可以设置多个class属性值 5 选择器分组又叫并集选择器 6 通配选择器 * 7 复合选择器 交集选择器
    11 1 块元素div的定义 2 常见的块元素 3 块元素的用途 4 内联元素,行内元素,span 5 内联元素和块元素的用途 6 a元素超链接的用法 7 p元素不可以包含任何其他的块元素
    10 1、IDE,dreamweaver,webstorm,hbuilder 2 Hbuilder快捷键
    9 1 css的注释 2 css的语法:选择器,声明块
    8 1 css 2 元素就是标签 2 内联样式 3 css选择器 style ,head ,内部样式表 4 外部样式表 css文件, link标签 ,href,
    7 1 超链接 a标签 href ,_self,_blank 2 center标签 居中显示 3 # 4 回到顶部 5 id定位 6 电子邮件超链接
    5 1 html的语法规范 大小写,注释嵌套,标签成对出现,属性,值,加引号
    4 1meta标签,name ,content,keywords,description,url,refresh
  • 原文地址:https://www.cnblogs.com/fraud/p/4354735.html
Copyright © 2011-2022 走看看