萌新刚学 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)
}