uva 10099 The Tourist Guide nyoj 1019 亲戚来了【单个路线最大流【最短路算法】】

题目:uva 10099 The Tourist Guide 

  nyoj 1019 亲戚来了

题意:给出一个无向图,每条路有一个容量。从 s 到 t 的一条最大的流量。


分析:这个题目可以用最短路的算法来做,最短路是求从 s 到 t 的最短路,这里是求从 s 到 t 的最小容量。最短路的三种算法都可以。

nyoj的使我们比赛的题目,有坑,图有重边,要处理,还有s可能等于t。

spfa代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 120;
const int inf = 0x3f3f3f3f;
struct Node
{
    int v,len;
};
vector v[N];
void add_Node(int x,int y,int z)
{
    v[x].push_back((Node){y,z});
    v[y].push_back((Node){x,z});
}
void v_clear(int n)
{
    for(int i=1;i<=n;i++)
        v[i].clear();
}
int dis[N];
void spfa(int s)
{
    memset(dis,inf,sizeof(dis));
    queue q;
    q.push(s);
    while(!q.empty())
    {
        int tmp=q.front();
        q.pop();
        for(int i=0;idis[ff.v])  //注意只要更新了都要压入
                    q.push(ff.v);
                dis[ff.v]=max(dis[ff.v],ans);
            }
            else
                q.push(ff.v),
                dis[ff.v]=ans;

        }
    }
}
int main()
{
    int n,m,cas=1;
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0 && m==0)
            break;
        for(int i=0; i=inf)
            printf("-1\n");
        else{
        dis[t]--;
        printf("Scenario #%d\n",cas++);
        printf("Minimum Number of Trips = %d\n\n",(num+dis[t]-1)/dis[t]);}
        v_clear(n);
    }
    return 0;
}

nyoj floyd 代码:

 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 120;
const int inf = 0x3f3f3f3f;
int mp[N][N];
int main()
{
    int n,m,cas=1;
    while(~scanf("%d%d",&n,&m))
    {
        memset(mp,inf,sizeof(mp));
        for(int i=1;i<=n;i++)
            mp[i][i]=0;
        for(int i=0; i=inf)
            printf("-1\n");
        else{
        mp[s][t]--;
        printf("%d\n",(num+mp[s][t]-1)/mp[s][t]);}
    }
    return 0;
}
        

nyoj dij代码:

 

#include 
#include 
#include 

using namespace std;
const int N = 120;
const int inf = 0x3f3f3f3f;
int map[N][N];
int n,m;
int dij(int s,int t)
{
    int vis[N],dis[N];
    memset(vis,0,sizeof(vis));
    memset(dis,-1,sizeof(dis));
    dis[s]=inf;
    //vis[t]=1;
    int tmp=s;
    while(1)
    {
        vis[tmp]=1;
        for(int i=1;i<=n;i++)
        {
            if(map[tmp][i]>0)
            {
                if(map[tmp][i]>dis[i])
                {
                    dis[i]=min(dis[tmp],map[tmp][i]);
                }
            }
        }
        int max=-1;
        for(int i=1;i<=n;i++)
        {
            if(vis[i]==0 && dis[i]>max)
            {
                max=dis[i];
                tmp=i;
            }
        }
//        printf("--%d\n",tmp);
        if(max==-1)
            return dis[t];
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        memset(map,0,sizeof(map));
        for(int i=0;i


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