Kotlin 代码求助
  • 板块学术版
  • 楼主NightTide
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/11 23:25
  • 上次更新2024/10/12 13:53:58
查看原帖
Kotlin 代码求助
547908
NightTide楼主2024/10/11 23:25

萌新刚学 Kotlin 第一天,把基础语法学完了打个代码熟悉一下。

发现 addEdge 函数里 e[cnt].to 的值一直是 NULL 赋值无效,求大佬帮忙看看为什么。

被 Kotlin 的各种安全表达搞红温了 QAQ

import java.util.Scanner
import java.util.ArrayDeque
import kotlin.math.min

const val MAXN: Int = 210
const val MAXM: Int = 5010
const val INF: Long = 0x3f3f3f3f3f3f3f3f
val reader = Scanner(System.`in`)

class Edge{
    var pre: Int = 0
    var to: Int = 0
    var flow: Long = 0
}

var n: Int = 0
var m: Int = 0
var s: Int = 0
var t: Int = 0
var cnt: Int = 1
var flw: Long = 0L

var pre = arrayOfNulls<Int>(MAXN)
var head = arrayOfNulls<Int>(MAXN)
var flow = arrayOfNulls<Long>(MAXN)
var vis = arrayOfNulls<Boolean>(MAXN)
var e = arrayOfNulls<Edge>(MAXM * 2)

fun addEdge(u: Int, v: Int, f: Long){
    e[++cnt]?.pre = head[u]!!
    e[cnt]?.to = v; e[cnt]?.flow = f
    head[u] = cnt
}
fun bfs(): Boolean{
    for(i in 1 .. n) vis[i] = false
    val q = ArrayDeque<Int>(); q.push(s)
    vis[s] = true; flow[s] = INF
    while(!q.isEmpty()){
        val now = q.first(); q.removeFirst()
        var i: Int? = head[now]!!
        while(i != 0){
            println("$i ${e[i!!]?.to}\n")
            if(e[i]?.flow == 0L || vis[e[i]?.to!!] == true) continue
            flow[e[i]?.to!!] = min(flow[now!!]!!, e[i]?.flow!!)
            pre[e[i]?.to!!] = i
            q.addLast(e[i]?.to!!)
            vis[e[i]?.to!!] = true
            i = e[i]?.pre
        }
    }
    return true
}
fun traceback(){
    var now = t
    while(now != s){
        e[pre[now]!!]?.flow = flow[t]?.minus(e[pre[now]!!]?.flow!!)!!
        e[pre[now]?.xor(1)!!]?.flow = e[pre[now]?.xor(1)!!]?.flow?.let { flow[t]?.plus(it) }!!
        now = e[pre[now]?.xor(1)!!]?.to!!
    }
    flw += flow[t]!!
}

fun main(){
    n = reader.nextInt(); m = reader.nextInt()
    s = reader.nextInt(); t = reader.nextInt()
    for(i in 1 .. m){
        var u: Int?; var v: Int?; var f: Long?
        u = reader.nextInt()
        v = reader.nextInt()
        f = reader.nextLong()
        addEdge(u, v, f)
        addEdge(v, u, 0L)
    }
    for(i in 2 .. cnt) println("$i ${e[i]?.to}")
//    while(bfs()) traceback();
//    println(flw)
}
2024/10/11 23:25
加载中...