携程编程大赛1004

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define M 40009
#define N 2000
using namespace std;
struct edge{
    int y,next,f,d;
    bool vis;
}e[M];
int cnt,p[N],gap[N],h[N],n,m,source,sink,X,Y;
bool vis[N];
int dis[N];
void add(int a,int b,int d,int f){
    e[cnt].y=b;
    e[cnt].f=f;
    e[cnt].d=d;
    e[cnt].next=p[a];
    e[cnt].vis=0;
    p[a]=cnt++;
    e[cnt].y=a;
    e[cnt].d=d;
    e[cnt].f=f;
    e[cnt].next=p[b];
    e[cnt].vis=0;
    p[b]=cnt++;
}
void init(){
    memset(p,-1,sizeof(p));
    memset(h,0,sizeof(h));
    memset(gap,0,sizeof(gap));
    memset(vis,0,sizeof(vis));
    memset(dis,0xf,sizeof(dis));
    cnt=0;
    source=0;
    sink=n+1;
    gap[0]=n+2;//总点数
}
int dfs(int x,int f){
    if(x==sink)
        return f;
    int i,mh=n-1,lf=f,d,y;
    for(i=p[x];i!=-1;i=e[i].next){
        y=e[i].y;
        if(e[i].vis==0)
            continue;
        if(e[i].f>0){
            if(h[x]==h[y]+1){
                d=min(e[i].f,lf);
                d=dfs(y,d);
                e[i].f-=d;
                e[i^1].f+=d;
                lf-=d;
                if(h[source]>=n)
                    return f-lf;
                if(lf==0)
                    break;
            }
            mh=min(mh,h[y]);
        }
    }
    if(f==lf){
        gap[h[x]]--;
        if(gap[h[x]]==0)
            h[source]=n;
        h[x]=mh+1;
        gap[h[x]]++;
    }
    return f-lf;
}
int spfa(){
    queue<int>q;
    q.push(X);
    vis[X]=1;
    dis[X]=0;
    while(!q.empty()){
        int f=q.front();
        vis[f]=0;
        q.pop();
        for(int i=p[f];i!=-1;i=e[i].next){
            int y=e[i].y;
            if(dis[y]>dis[f]+e[i].d){
                dis[y]=dis[f]+e[i].d;
                if(!vis[y])
                    q.push(y),vis[y]=1;
            }
        }
    }
    return dis[Y];
}
void check(){
    queue<int>q;
    q.push(X);
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){
        if(dis[i]>dis[Y])
            continue;
        for(int j=p[i];j!=-1;j=e[j].next){
            if(dis[e[j].y]>dis[Y]||dis[i]+e[j].d>dis[e[j].y])//判断边是否是最短路上的边
                continue;
            e[j].vis=1;
//            printf("x=%d y=%d f=%d\n",i,e[j].y,e[j].f);
        }
    }
}
int main(){
    int i,j,k,x,y,f,d;
    while(scanf("%d%d",&n,&m)&&n&&m){
        init();
        scanf("%d%d",&X,&Y);
        add(source,X,0,1e8);
        e[cnt-1].vis=1;
        e[cnt-2].vis=1;
        add(Y,sink,0,1e8);
        e[cnt-1].vis=1;
        e[cnt-2].vis=1;
        while(m--){
            scanf("%d%d%d%d",&x,&y,&d,&f);
            add(x,y,d,f);
        }
        spfa();
        check();
        int s=0;
        n+=2;
        while(h[source]<n)
            s+=dfs(source,1e8);
        printf("%d\n",s);
    }
    return 0;
}

先求出最短路,然后遍历每条边,如果边长大于两边到起点的距离只差,则该边不可走


将删除的代价作为流量,跑一边最大流(最小割)就是结果

### Android 平台上的异步编程与协程 #### 协程的优势及其设计理念 协程允许开发者以合作而非抢占的方式来管理异步任务,这不仅简化了代码逻辑,而且提供了更好的控制能力。相较于传统的多线程模型,协程支持子协程的嵌套关闭、更简便的异常处理机制等功能,因此被认为是一种更为先进的理念[^1]。 ```kotlin // 创建一个简单的协程来执行耗时操作 lifecycleScope.launch { val result = withContext(Dispatchers.IO) { // 执行网络请求或其他I/O密集型工作 performNetworkRequest() } updateUI(result) } ``` #### 实现同步方式编写异步代码 为了使异步调用看起来像同步代码一样直观易读,在Kotlin中可以通过`withContext`函数轻松实现这一点。此方法可以在不同调度器之间无缝切换,从而让开发者能够在不破坏原有流程的情况下完成复杂的异步任务[^3]。 ```kotlin coroutineScope.launch(Dispatchers.Main) { val image = withContext(Dispatchers.IO) { downloadImageFromUrl(urlString) } imageView.setImageBitmap(image) } ``` #### 管理协程的作用域 协程作用域用于定义协程在整个应用程序中的生命周期边界,并负责管理和清理这些协程所占用的资源。合理设置协程作用域能够有效防止内存泄漏等问题的发生[^4]。 ```kotlin class MyViewModel : ViewModel() { private val viewModelJob = Job() override fun onCleared() { super.onCleared() viewModelJob.cancel() } init { viewModelScope.launch(viewModelJob) { // 启动新的协程... } } } ``` #### 结合Lifecycle组件优化用户体验 当涉及到长时间运行的任务时,可以借助`lifecycleScope`或`viewModelScope`等工具类来确保即使Activity被销毁也能安全地中止正在执行的操作,进而提升整体稳定性和流畅度[^5]。 ```kotlin fun loginButtonClicked() { lifecycleScope.launch { try { showLoadingIndicator(true) delay(2000L)//模拟登录过程延迟 doLoginTask() navigateToHomeScreen() } finally { showLoadingIndicator(false) } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值