其实这是昨天的事了。(现在时间回到一天前)

今天主要就是考试了,可以算是半期考。

我做了2题。。。有点少

次短路问题:9018_2095

题意简述,给你一幅图,求出次短路

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){
    int num=0,t=1;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();}
    while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+c-'0';c=getchar();}
    return num*t;
}
const int maxn=5005,INF=1e9;
int n,m,d[maxn],d2[maxn];
struct edge{int to,c;};vector<edge>g[maxn];
typedef pair<int,int>P;
void add(int f,int t,int c){
    g[f].push_back((edge){t,c});
    g[t].push_back((edge){f,c});
}
void solve(){
    priority_queue< P,vector<P>,greater<P> >q;
    fill(d,d+n,INF);fill(d2,d2+n,INF);
    q.push(P(0,0));d[0]=0;
    while(!q.empty()) {
        P p=q.top();q.pop();
        int v=p.second,dis=p.first;
        if(d2[v]<dis)continue;
        for(int i=0;i<g[v].size();i++){
            edge e=g[v][i];int dis2=dis+e.c;
            if(d[e.to]>dis2)
                swap(d[e.to],dis2),q.push(P(d[e.to],e.to));
            if(d2[e.to]>dis2&&d[e.to]<dis2)
                d2[e.to]=dis2,q.push(P(d2[e.to],e.to));
        }
    }
    printf("%d\n",d2[n-1]);
}
int main(){
    n=read();m=read();
    for(int i=1;i<=m;i++){
        int a=read(),b=read(),c=read();add(a-1,b-1,c);
    }solve();
    return 0;
}

保卫萝卜 9018_2101

二分加网络流即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector> 
#include<queue>
#define For(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
inline int read(){
    int t=1,num=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();}
    while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+c-'0';c=getchar();}
    return num*t;
}
const int INF=10000010,mn=111;
const double eps=1e-5;
struct edge{int to;double c;int rev;};
vector<edge> g[mn];
int iter[mn],level[mn];
void add(int f,int t,double c){
    g[f].push_back((edge){t,c,g[t].size()});
    g[t].push_back((edge){f,0,g[f].size()-1});
}
void bfs(int s){
    memset(level,0,sizeof(level));
    queue<int>q;
    level[s]=1;q.push(s);
    while(!q.empty()){
        int v=q.front();q.pop();
        for(int i=0;i<g[v].size();i++){
            edge &e=g[v][i];
            if(e.c>0&&level[e.to]==0){
                level[e.to]=level[v]+1;
                q.push(e.to);
            }
        }
    }
}
double dfs(int v,int t,double f){
    if(v==t) return f;
    for(int &i=iter[v];i<g[v].size();i++){
        edge &e=g[v][i];
        if(e.c>0&&level[v]+1==level[e.to]){
            double d=dfs(e.to,t,min(f,e.c));
            if(d>0){
                e.c-=d;
                g[e.to][e.rev].c+=d;
                return d;
            }
        }
    }
    return 0;
}
double flow(int s,int t){
    double flow=0;
    while(1){
        bfs(s);
        if(level[t]==0) return flow;
        memset(iter,0,sizeof(iter));
        double f;
        while((f=dfs(s,t,INF))>0)flow+=f;
    }
}
int n,m,a[51],b[51],c[51][51],s=0,t=mn-2,tot=0;
double check(double num){
    for(int i=0;i<mn;i++)g[i].clear();
    for(int i=1;i<=m;i++)add(s,i,num*(double)(b[i]));
    for(int i=1;i<=n;i++)add(i+m,t,(double)(a[i]));
    for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)
        if(c[i][j])add(i,j+m,(double)(INF));
    double x=flow(s,t);
    return x;
}
void erfen(double l,double r){
    double mid;
    while(r-l>eps){
        mid=(l+r)/2.0;
        if(check(mid)==(double)tot)r=mid;
        else l=mid;
    }
    printf("%.3lf\n",mid);
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read(),tot+=a[i];
    for(int i=1;i<=m;i++)b[i]=read();
    for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)c[i][j]=read();
    erfen(0,double(tot));
    return 0;
}

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

posted on 2017-07-07 21:52  Yzyet  阅读(127)  评论(0编辑  收藏  举报